Sar*_*kar 65 linq-to-entities entity-framework-4
var result =
(from bd in context.tblBasicDetails
from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
select new clsProfileDate()
{
DOB = pd.DOB
});
foreach (clsProfileDate prod in result)
{
prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today;
int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd"));
string dif = (now - dob).ToString();
string age = "0";
if (dif.Length > 4)
age = dif.Substring(0, dif.Length - 4);
prod.Age = Convert.ToInt32(age);
}
GetFinalResult(result);
Run Code Online (Sandbox Code Playgroud)
protected void GetFinalResult(IQueryable<clsProfileDate> result)
{
int from;
bool bfrom = Int32.TryParse(ddlAgeFrom.SelectedValue, out from);
int to;
bool bto = Int32.TryParse(ddlAgeTo.SelectedValue, out to);
result = result.AsQueryable().Where(p => p.Age >= from);
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到一个例外:
LINQ to Entities不支持指定的类型成员"Age".仅支持初始值设定项,实体成员和实体导航属性.
如果Age不在数据库中,则是我在clsProfileDate类中创建的属性,用于从DOB计算Age.对此有何解决方案?
Sla*_*uma 90
您不能使用未映射到Where
表达式中的数据库列的属性.您必须基于映射属性构建表达式,例如:
var date = DateTime.Now.AddYears(-from);
result = result.Where(p => date >= p.DOB);
// you don't need `AsQueryable()` here because result is an `IQueryable` anyway
Run Code Online (Sandbox Code Playgroud)
作为未映射Age
属性的替代,您可以将此表达式提取到静态方法中,如下所示:
public class clsProfileDate
{
// ...
public DateTime DOB { get; set; } // property mapped to DB table column
public static Expression<Func<clsProfileDate, bool>> IsOlderThan(int age)
{
var date = DateTime.Now.AddYears(-age);
return p => date >= p.DOB;
}
}
Run Code Online (Sandbox Code Playgroud)
然后以这种方式使用它:
result = result.Where(clsProfileDate.IsOlderThan(from));
Run Code Online (Sandbox Code Playgroud)
Ton*_*ony 20
很多人都会说这是一个错误的答案,因为这不是最佳实践,但你也可以在你的位置之前将其转换为List.
result = result.ToList().Where(p => date >= p.DOB);
Run Code Online (Sandbox Code Playgroud)
Slauma的答案更好,但这也可行.这会花费更多,因为ToList()将对数据库执行查询并将结果移动到内存中.
Mar*_*ijk 11
当您不小心忘记为属性定义setter时,您也会收到此错误消息.例如:
public class Building
{
public string Description { get; }
}
var query =
from building in context.Buildings
select new
{
Desc = building.Description
};
int count = query.ToList();
Run Code Online (Sandbox Code Playgroud)
对ToList的调用将给出相同的错误消息.这是一个非常微妙的错误,很难检测到.
归档时间: |
|
查看次数: |
87564 次 |
最近记录: |