我有一个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以这种方式工作?有没有办法重新写我的财产,以便它可以工作?
答案 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;