2010-03-15 111 views
1

根據我如何將我的linq查詢映射到我的域對象,我得到以下錯誤LINQ to SQL Translation

成員'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的我與測試:

[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翻譯?

感謝 本

回答

3

它試圖映射整個LINQ查詢到SQL,包括所有的方法和屬性調用。唯一的例外是對象初始值設定語法(對於匿名作爲命名類型)和自身映射到SQL的擴展方法(例如,.Count())。

小故事:你不能使用Linq to SQL或Entity Framework的非默認構造函數。

+0

在我需要使用構造函數的情況下,我該怎麼辦?例如,我需要初始化對象的狀態,並且這是使用持久化到數據庫的枚舉完成的。因此,我需要將此值傳遞給構造函數。謝謝 – 2010-03-16 15:15:13

+0

您可以擁有一個構造函數,而不是帶參數的構造函數。初始化應該在無參數(=默認)構造函數中進行。 – 2010-03-16 16:23:23

+0

好吧,但我相信在分配屬性值之前,使用上面的對象初始化器語法進行初始化會觸及默認構造器。所以,如果我需要初始化一個基於我上面映射的狀態屬性,我將不得不添加某種初始化方法,並在映射完成後調用它。 – 2010-03-16 19:58:41

1

這裏最重要的問題是混合謂詞和投影語義。

一旦你的項目(與select即),它不再是安全的,直到你兌現的結果與ToList()ToArray()或類似使用Where擴展。第二種情況只是發生工作,因爲投影是完全透明的 - 你所做的只是屬性分配和同一個類。構造函數不屬於這個類別;如錯誤消息所述,SQL Server中沒有構造函數調用的等效表示。

爲什麼你需要做這個投影呢?整個屬性可以被替換爲:

return _db.ShippingMethods.AsQueryable(); 
+0

從我的代碼中可能不清楚,但我沒有使用Linq對象。所以_db.ShippingMethods返回Linq.ShippingMethod,但我映射到MyModel.ShippingMethod。 無論如何感謝您的解釋。 – 2010-03-16 15:11:42