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);
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);
}
在这里,我得到一个例外:
指定的类型成员“年龄”不支持LINQ到实体。 只有初始化,实体成员和实体导航属性都支持。
凡年龄是不是在数据库是财产我clsProfileDate类创建从DOB计算年龄。 任何解决这个?
不能使用未在映射到数据库列属性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
至于你未映射的替代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;
}
}
然后用它是这样的:
result = result.Where(clsProfileDate.IsOlderThan(from));
很多人会说这是一个不好回答,因为它不是最好的做法,但你也可以在你的面前,其中转换到一个列表。
result = result.ToList().Where(p => date >= p.DOB);
Slauma的回答是好,但这将正常工作。 这种成本更多的是因为ToList()将会对数据库执行查询,并将结果移动到内存中。
您也将获得此错误消息,当您不小心忘记定义setter的属性。 例如:
public class Building
{
public string Description { get; }
}
var query =
from building in context.Buildings
select new
{
Desc = building.Description
};
int count = query.ToList();
到ToList呼叫将给予同样的错误信息。 这是一个非常微妙的错误,防不胜防。
忘了选择列(或设置/映射属性到列值):
IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
where ...
select new DataModel { Name = t.Name };
调用queryable.OrderBy("Id")
会抛出异常,即使DataModel
已经财产Id
定义。
正确的查询是:
IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
where ...
select new DataModel { Name = t.Name, Id = t.Id };
在这种情况下,最简单,最好的方法之一是先投它list
,然后用where
或select
。
result = result.ToList().where(p => date >= p.DOB);
文章来源: The specified type member is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported