2010-03-02 42 views
3

我有一个D对象,该对象由D表的自动映射创建。我在分部类中为它添加了以下属性。Linq在一个语句中工作,但没有在属性中选择

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; 

不工作。当我尝试遍历result时,它会抛出一个NotSupportedException

但是,下列情况工作:

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

为什么LINQ到SQL工作这种方式?有没有办法重新编写我的财产,以便它的工作?

回答

3

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

属性中的代码起作用,因为当您询问地址时,内部映射到生成的有效列或EntityRef。

2

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

虽然注意到性能!在执行.ToList()之前,您正在拉取所有未过滤的内容!如果你在一个大的问题上这样做,它可能是desvastous为您查询性能。

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; 
+0

我相信我会在属性做到这一点? – 2010-03-03 01:16:42

+0

没有不在属性中,你这样做会取代你的查询。 to列表将IQueryable转换为List,从而列举它 - 说为它执行SQL。然后通过where子句筛选返回的结果。 – AxelEckenberger 2010-03-03 07:40:35

+0

这是一个非常危险的建议。你无条件地将整张桌子放在记忆中! – jeroenh 2010-03-03 19:32:26