LINQ to Entities不支持指定的types成员。 仅支持初始化器,实体成员和实体导航属性

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); } 

在这里我得到一个例外:

指定的types成员“Age”在LINQ to Entities中不受支持。 仅支持初始化器,实体成员和实体导航属性。

年龄不在数据库中,它是我在clsProfileDate类中创build的属性,用于从DOB计算年龄。 任何解决scheme?

您不能使用未映射到Whereexpression式中的数据库列的属性。 您必须根据映射的属性构buildexpression式,如:

 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属性的替代品,你可以将这个expression式提取成静态方法,如下所示:

 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的调用会给出相同的错误信息。 这是一个非常微妙的错误,很难发现。