根据我将linq查询映射到域对象的方式,我收到以下错误
成员'member'没有受支持的SQL翻译。
此代码导致错误:
public IQueryable<ShippingMethod> ShippingMethods {
get {
return from sm in _db.ShippingMethods
select new ShippingMethod(
sm.ShippingMethodID,
sm.Carrier,
sm.ServiceName,
sm.RatePerUnit,
sm.EstimatedDelivery,
sm.DaysToDeliver,
sm.BaseRate,
sm.Enabled
);
}
}
此代码可以正常工作:
public IQueryable<ShippingMethod> ShippingMethods
{
get
{
return from sm in _db.ShippingMethods
select new ShippingMethod
{
Id = sm.ShippingMethodID,
Carrier = sm.Carrier,
ServiceName = sm.ServiceName,
EstimatedDelivery = sm.EstimatedDelivery,
DaysToDeliver = sm.DaysToDeliver,
RatePerUnit = sm.RatePerUnit,
IsEnabled = sm.Enabled,
BaseRate = sm.BaseRate
};
}
}
这是我测试的测试方法:
[TestMethod]
public void Test_Shipping_Methods() {
IOrderRepository orderRepo = new SqlOrderRepository();
var items = orderRepo.ShippingMethods.Where(x => x.IsEnabled);
Assert.IsTrue(items.Count() > 0);
}
我实例化对象的方式如何影响linq到sql的翻译?
由于 本
答案 0 :(得分:3)
它尝试将整个linq查询映射到SQL,包括所有方法和属性调用。唯一的例外是对象初始化器语法(对于匿名作为命名类型)和自身映射到SQL的扩展方法(例如.Count()
)。
简短的故事:您不能将非默认构造函数与Linq to SQL或Entity Framework一起使用。
答案 1 :(得分:1)
这里最重要的问题是你正在混合谓词和投影语义。
投影后(即使用select
),在使用Where
,ToList()
或类似内容实现结果之前,使用ToArray()
扩展名已不再安全。第二种情况只是发生才能正常工作,因为投影是完全透明的 - 您所做的只是属性赋值,并且属于同一个类。构造者不属于这一类;正如错误消息所示,SQL Server中没有构造函数调用的等效表示。
为什么你还需要做这个投影呢?整个属性可以替换为:
return _db.ShippingMethods.AsQueryable();