2013-08-06 65 views
3

數據庫包含Orders。訂單可以包含在一組訂單中。 對於每組訂單,它可以包含1到多個訂單。LINQ to Entities不能識別Generic.List(int)方法爲Generic.IEnumerable(int)方法

但是,訂單可能有一個NULL值賦值爲GroupOrderId,因爲以前的訂單沒有分組概念。只有新訂單強制執行添加到組的概念。

類結構,以便對每個訂單執行操作來填充是

public class OrdersGroup 
{ 
    public int? GroupOrderId { get; set; } 
    public List<int> OrderIds { get; set; } 
} 

LINQ的聲明

var workPacketOrdersList = (from o in db.Orders 
            where 
             o.GroupOrderId >= groupOrderIdMin && o.GroupOrderId <= groupOrderIdMax && 
             o.IsDeleted == false 
            orderby o.WorkPacketId ascending 
            group o by o.WorkPacketId 
            into grp 
            select new OrdersGroup 
               { 
                GroupOrderId = grp.Key, 
                OrderIds = grp.Select(g => g.OrderId).ToList() 
               }).ToList(); 

完全例外

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable`1[System.Int32])' method, and this method cannot be translated into a store expression. 

我看到返回linq查詢的類型是List<OrdersGroup>

如果最終.ToList()從查詢中省略比返回類型成爲IQueryable<OrdersGroup>

不管未來結果卻是一個例外,這個方法不能被翻譯成店表達式執行什麼動作。

我試圖刪除特定的select new OrdersGroup到更通用的select new,然後對此結果執行操作只是爲了找到相同的存儲表達式異常。

有人可以提供一些見解,這linq是不正確的?

回答

9

這是失敗的部分 - grp.Select(g => g.OrderId).ToList() - 在select子句中不能有.ToList()。刪除,你應該沒問題。

+1

如果我可以標記所有4個答案正確,我會。這是第一次。 (公開列表 OrderIds {get; set;})to(public IEnumerable OrderIds {get; set;})??( – iamchrisfryer

+0

) –

2

這是因爲您正試圖在查詢的一部分中調用ToList(),該查詢將成爲原始SQL並在源代碼(即SQL Server,而不是CLR)上執行。我不確切知道你的數據是什麼,所以我不一定會就如何解決這個問題提出一個準確的建議,但是我會嘗試在這個查詢之後調用ToList(),或者只是沒有完成。可能IEnumberable將提供您需要的任何功能,這是Select將返回的內容,如果您刪除ToList()呼叫。

順便說一句,因爲我不明確,我指的是ToList()調用內部的選擇 - (倒數第二行)OrderIds = grp.Select(g => g.OrderId).ToList()另一個是好的。它在SQL查詢的結果上執行完全正常,您不能在SQL提供程序執行的查詢中調用特定於C#的方法。

+0

+1感謝您澄清內部.ToList()是特定於C#的調用 – iamchrisfryer

6

問題是,LINQ to Entities試圖將您的查詢轉換爲SQL。它不知道如何將ToList轉換爲SQL,所以這是問題所在。您需要從查詢中刪除對ToList的呼叫。

也就是說,

OrderIds = grp.Select(g => g.OrderId).ToList() 

LINQ到實體無法轉換爲SQL。刪除通話

OrderIds = grp.Select(g => g.OrderId) 

,如果你需要OrderIds是一個List<int>,做號召ToList執行查詢後。

1

你的問題是你在你的select語句中選擇一個列表。

select new OrdersGroup 
{ 
    GroupOrderId = grp.Key, 
    OrderIds = grp.Select(g => g.OrderId).ToList() 
    /////////////////////////////////////^^^^^^^^^HERE 
} 

你需要做的是改變OrderIds一個IEnumerable<int>,然後擺脫ToList的。

相關問題