Linq to sql Linq在一条语句中工作,但在属性中不使用选择

Linq to sql Linq在一条语句中工作,但在属性中不使用选择,linq-to-sql,lambda,Linq To Sql,Lambda,我有一个从D表的自动映射创建的D对象。我在一个分部类中添加了以下属性 public Address PhysicalAddress { get { return this.Addresses.FirstOrDefault(a => a.AddrType == "PHY"); } } 这本身就很好用 我想在此基础上编写以下linq查询: var result = from d in _db.D where d.PhysicalAddress.State == addr.Sta

我有一个从
D
表的自动映射创建的
D
对象。我在一个分部类中添加了以下属性

public Address PhysicalAddress
{
   get { return this.Addresses.FirstOrDefault(a => a.AddrType == "PHY"); }
}
这本身就很好用

我想在此基础上编写以下linq查询:

var result = from d in _db.D
    where d.PhysicalAddress.State == addr.State
    select d;
这不管用。当我尝试迭代
结果
时,它抛出一个
NotSupportedException

但是,以下方法确实有效:

var result = from d in _db.D
    where d.Addresses.Single(dAddr => dAddr.AddrType == "PHY").State == addr.State
    select d;

为什么linqtosql是这样工作的?是否有办法重新写入我的属性,使其工作?

针对数据上下文的LinQ语句尝试生成SQL语句,然后对db执行该语句。由于PhysicalAddress是通过分部类定义的逻辑属性,尽管类型知道它,因此它可以编译,但Linq无法将其映射到DB列以通过字段动态构造查询。在使用linq to sql时,严格遵守生成的所有映射列


属性中的代码可以工作,因为当您请求地址时,内部映射到生成的有效列或EntityRef

您还可以在对表应用where子句之前显式枚举表,从而防止生成无法映射的SQL

不过要注意表演的热播在执行.ToList()之前,您正在提取所有未过滤掉的内容!如果在大型thable上执行此操作,可能会降低查询性能

var result = _db.D.ToList().Where(d => d.PhysicalAddress.State == addr.State); 
或者使用查询语法

var result = from d in _db.D.ToList()
    where d.PhysicalAddress.State == addr.State
    select d;

我想我会在属性中这样做?不,不是在属性中,您这样做会替换您的查询。to列表将IQueryable转换为一个列表,从而枚举它,并为其执行SQL。然后通过where子句过滤返回的结果。这是一个非常危险的建议。你无条件地把整张桌子放在记忆里@jeroenh:这就是为什么我用粗体字写“注意性能冲击”。但是,考虑到你的评论,我修改了答案。显然,做<代码> Toistist是你应该仔细考虑的事情,只有仔细考虑才行。