Entity framework 4 LINQ to实体中不支持指定的类型成员。仅支持初始值设定项、实体成员和实体导航属性 var结果= (来自context.tblBasicDetails中的bd) 从context.tblPersonalDetails.Where(x=>x.UserId==bd.UserId).DefaultIfEmpty()中的pd 来自context.tblOtherPersonalDetails.Where(x=>x.UserId==bd.UserId).DefaultIfEmpty()中的opd 选择新的clsProfileDate() { DOB=pd.DOB }); foreach(clsProfileDate产品导入结果) { 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”); 字符串dif=(现在为-dob).ToString(); 字符串年龄=“0”; 如果(dif.长度>4) 年龄=离散子串(0,离散长度-4); 产品年龄=转换为32岁(年龄); } GetFinalResult(结果); 受保护的无效GetFinalResult(IQueryable结果) { int from; bool bfrom=Int32.TryParse(ddlAgeFrom.SelectedValue,out from); int到; bool bto=Int32.TryParse(ddlAgeTo.SelectedValue,out to); result=result.AsQueryable(),其中(p=>p.Age>=from); }

Entity framework 4 LINQ to实体中不支持指定的类型成员。仅支持初始值设定项、实体成员和实体导航属性 var结果= (来自context.tblBasicDetails中的bd) 从context.tblPersonalDetails.Where(x=>x.UserId==bd.UserId).DefaultIfEmpty()中的pd 来自context.tblOtherPersonalDetails.Where(x=>x.UserId==bd.UserId).DefaultIfEmpty()中的opd 选择新的clsProfileDate() { DOB=pd.DOB }); foreach(clsProfileDate产品导入结果) { 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”); 字符串dif=(现在为-dob).ToString(); 字符串年龄=“0”; 如果(dif.长度>4) 年龄=离散子串(0,离散长度-4); 产品年龄=转换为32岁(年龄); } GetFinalResult(结果); 受保护的无效GetFinalResult(IQueryable结果) { int from; bool bfrom=Int32.TryParse(ddlAgeFrom.SelectedValue,out from); int到; bool bto=Int32.TryParse(ddlAgeTo.SelectedValue,out to); result=result.AsQueryable(),其中(p=>p.Age>=from); },entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,这里我得到一个例外: LINQ to实体中不支持指定的类型成员“Age”。 仅初始值设定项、实体成员和实体导航属性 支持 若年龄不在数据库中,那个么它是我在clsProfileDate类中创建的属性,用于从DOB计算年龄。有解决方案吗?您不能使用未映射到Where表达式中数据库列的属性。必须基于映射的属性生成表达式,如: var date=DateTime.Now.AddYears(-from); 结果=结果,其中(p=>date>=p.DOB); //这里不需要'AsQueryable()',

这里我得到一个例外:

LINQ to实体中不支持指定的类型成员“Age”。 仅初始值设定项、实体成员和实体导航属性 支持


若年龄不在数据库中,那个么它是我在clsProfileDate类中创建的属性,用于从DOB计算年龄。有解决方案吗?

您不能使用未映射到
Where
表达式中数据库列的属性。必须基于映射的属性生成表达式,如:

var date=DateTime.Now.AddYears(-from);
结果=结果,其中(p=>date>=p.DOB);
//这里不需要'AsQueryable()',因为结果无论如何都是'IQueryable'
作为未映射
Age
属性的替换,您可以将此表达式提取到静态方法中,如下所示:

公共类clsProfileDate
{
// ...
public DateTime DOB{get;set;}//映射到DB表列的属性
公共静态表达式IsOlderThan(int年龄)
{
var date=DateTime.Now.AddYears(-age);
返回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的调用将给出相同的错误消息。这是一个非常微妙的错误,很难发现

我忘记选择列(或将属性设置/映射到列值):


在这种情况下,最简单和最好的方法之一是首先将其强制转换为
列表
,然后使用
where
选择

result = result.ToList().where(p => date >= p.DOB);
在WHERE子句之前检查Count()解决了我的问题。它比ToList便宜


在我的例子中,虽然我的应用程序的二进制文件是相同的,但我只在生产环境中收到了这个错误消息,而在本地运行时却没有收到

在我的应用程序中,我会将运行时生成的EDMX保存到磁盘,并在启动时从磁盘加载(而不是从头开始重新生成)为了减少应用程序启动时间——并且由于代码中的错误,我没有使磁盘上的EDMX文件无效——因此生产部门使用的是磁盘上的EDMX文件的旧版本,该文件引用了我在异常错误消息中重命名类型名称之前的应用程序类型的旧版本


删除缓存文件并重新启动应用程序将其修复。

经过一些愚蠢的重新分解后,这就是我的原因。但如果它是不可更新的SQL视图,为什么我需要setter?这并不重要。实体框架仍然需要一种设置属性的方法。在普通的C#代码中,您将无法执行如下操作:Building b=new Building();b、 Description=“测试”;感觉脏了,但效果很小。调用
ToList
时,将执行查询,并将不必要的数据加载到内存中。所以最好在编码上有一些限制!这对我来说很好,因为我有问题的属性在Sum Linq函数中,而不是在Where子句中。所以我没有得到不必要的数据,在检索到的数据上,我做的是Linq Sum函数,它在列表中工作。非常感谢。在某些情况下,一开始看起来很糟糕的东西可能非常有用!这对我来说非常有效,因为我们正在修改其中一个字段,以便根据另一个字段中的布尔值在其上预先添加数据。(标记项目停用),它拒绝工作,直到我在中间贴了一个托勒斯。此外,请检查下面的hp93答案,
从a In db.aitems中选择新模型{a=a.a}
,在此查询表中,您必须明确指定要在
Where
中使用的所有属性,因此在这里您可以按a进行筛选、分组或排序,因为您只有a-
a=a.a
IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
                                    where ...
                                    select new DataModel { Name = t.Name, Id = t.Id };
result = result.ToList().where(p => date >= p.DOB);
if (authUserList != null && _list.Count() > 0)
    _list = _list.Where(l => authUserList.Contains(l.CreateUserId));