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是你应该仔细考虑的事情,只有仔细考虑才行。