Linq在一个声明中工作,但没有选择属性

时间:2010-03-02 00:21:07

标签: 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.State
    select d;

哪个不起作用。当我尝试迭代NotSupportedException时,它会抛出result

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

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

为什么Linq to Sql以这种方式工作?有没有办法重新写我的财产,以便它可以工作?

2 个答案:

答案 0 :(得分:3)

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

属性中的代码有效,因为当您要求Addresses时,内部映射到生成的有效列或EntityRef。

答案 1 :(得分:2)

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

请注意性能提升!在执行.ToList()之前,您正在提取尚未过滤掉的所有内容!如果你在一个很大的问题上执行此操作,那么查询性能可能非常糟糕

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;