LINQ to SQL翻译

时间:2010-03-15 23:09:06

标签: linq-to-sql

根据我将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的翻译?

由于 本

2 个答案:

答案 0 :(得分:3)

它尝试将整个linq查询映射到SQL,包括所有方法和属性调用。唯一的例外是对象初始化器语法(对于匿名作为命名类型)和自身映射到SQL的扩展方法(例如.Count())。

简短的故事:您不能将非默认构造函数与Linq to SQL或Entity Framework一起使用。

答案 1 :(得分:1)

这里最重要的问题是你正在混合谓词和投影语义。

投影后(即使用select),在使用WhereToList()或类似内容实现结果之前,使用ToArray()扩展名已不再安全。第二种情况只是发生才能正常工作,因为投影是完全透明的 - 您所做的只是属性赋值,并且属于同一个类。构造者不属于这一类;正如错误消息所示,SQL Server中没有构造函数调用的等效表示。

为什么你还需要做这个投影呢?整个属性可以替换为:

return _db.ShippingMethods.AsQueryable();