Linq to sql 使用表达式手动Linq到Sql映射是否有效?

Linq to sql 使用表达式手动Linq到Sql映射是否有效?,linq-to-sql,.net-4.0,domain-driven-design,expression-trees,Linq To Sql,.net 4.0,Domain Driven Design,Expression Trees,我有一个问题: 车辆类型派生自具有属性ID的EntityObject类型 我想我明白了为什么L2S不能将其转换为SQL——它不知道WHERE子句应该包括WHERE VICTOLEID==value。VehicleId btw是表上的PK,而对象模型中的属性(如上所述)是ID 我能用表达式树赢吗?因为创建一个表达式来传递给SingleOrDefault方法似乎很容易,但是L2S仍然无法转换它吗 我正在尝试对DDD友好,因此我不想用ColumnAttributes等装饰我的域模型对象。但是,我很高

我有一个问题:

车辆类型派生自具有属性ID的EntityObject类型

我想我明白了为什么L2S不能将其转换为SQL——它不知道WHERE子句应该包括WHERE VICTOLEID==value。VehicleId btw是表上的PK,而对象模型中的属性(如上所述)是ID

我能用表达式树赢吗?因为创建一个表达式来传递给SingleOrDefault方法似乎很容易,但是L2S仍然无法转换它吗

我正在尝试对DDD友好,因此我不想用ColumnAttributes等装饰我的域模型对象。但是,我很高兴自定义我的L2S dbml文件,并在数据层中添加表达式帮助程序/任何东西,希望使ORM业务远离我的域模型

更新:

我没有在select语句中使用对象初始化语法。像这样:

private IQueryable<Vehicle> Vehicles() 
{
    return from vehicle in _dc
        select new Vehicle() { ID = vehicle.VehicleId };
}
我实际上在使用构造函数,这将导致上述问题。这就是我正在做的:

private IQueryable<Vehicle> Vehicles() 
{
    return from vehicle in _dc
        select new Vehicle(vehicle.VehicleId);
}
我知道L2S无法从上面的屏幕抓取中转换表达式树,因为它不知道通常从对象初始化语法推断的映射。我怎样才能避开这件事?是否需要使用属性绑定构建表达式?

简短回答:不要

我曾经尝试将IQueryable应用于Linq2Sql。我被严重烧伤了

正如你所说。L2S和EF在这方面也不知道ID映射到VehicleId列。您可以通过将Vehicle.ID重构为Vehicle.VehicleID来解决这个问题。是的,如果它们是同一个名字,它们就可以工作。不过我还是不推荐

将L2S与其提供的对象一起使用。在使用IQueryable时,在其上覆盖一个额外的层。。。从我的经验来看,这很糟糕

另一种方法是在完成select语句后执行.ToList。这会将所有车辆加载到您的内存中。然后对Linq 2对象集合执行.Where语句。当然,这不会像L2S处理所有查询那样有效,并且会导致更大的内存使用


长话短说。不要将Sql IQueryable与它最初设计用于的对象以外的任何对象一起使用。它就是不太好用。

根据进一步的经验,我认为这是不可能的

在映射投影中使用参数化的ctor时,L2S无法创建正确的WHERE子句。这是传统L2S映射投影中的初始值设定项语法,它为L2S提供了所需的上下文


简短回答-使用NHibernate。

我想你可能误解了我的问题。我很害怕这一点——很难清楚地表达这个问题。我不会在我的存储库之外使用IQueryable。您还可以通过将Vehicle.ID重构为Vehicle.VehicleID来解决这个问题。是的,如果它们的名称相同,则它们可以工作是不正确的-将字段更改为VehicleID不会解决我的问题。绑定上下文受制于使用初始值设定项语法,而不是更改属性名称。这就是初始化器语法的全部要点——无缝地从PropA映射到ProbB。谢谢你的回答。