2013-05-16 45 views
1

考慮在以下表格與數據Linq查詢到多個相關數據順序由

Customers -> Orders -> Items 

Customers -> 
A 
B 
C 

Orders -> 
o1 - A, 
o2 - A, 
o3 - B, 
o4 - C 

OrderItems -> 
o1 - Item1, 
o1 - Item2, 
o2 - Item3, 
o3 - Item2, 
o4 - Item1 

Item -> 
Item1, 
Item2, 
Item3, 
Item4 

我們有一個類似的映射如上面我們的數據庫。 現在LINQ我想獲得通過是逗號項目排序中的客戶名單分隔 如:

Customer  Items 
C   Item1 
A   Item1, Item2  
B   Item2 

我用盡像這樣

Customer.OrderBy(cust => string.Join(",", cust.Orders 
               .SelectMany(order=>order.OrderItems) 
               .Select(orderItem=> orderItem.Item.Name) 
               .OrderBy(item=>item))); 

但string.join是可不允許內部LINQ陳述.. 它不需要顯示在我的網格中的項目,但我需要得到客戶按逗號分隔項目排序..

而且我也不想要這在UI級別完成作爲需要在IQueryable客戶對象上完成排序,並添加其他篩選器並稍後執行。 通過使用IQueryable Customer對象進行查詢,返回IQueryable對象。

回答

0

當您查詢Customer集合時,您的查詢將轉換爲sql指令。既然你提到過其他的過濾器,我想這是一張大桌子,你不想顯示/獲取所有行。

連的string.join運營商被允許在EF,您的訂單條款上的複雜語句,需要爲每一行以確定正確的結果,爲了處理工作(見this question爲你的的string.join會做an example )。

您需要以某種方式簡化您的訂單子句或將項目列表字符串存儲到一個sql字段中。如果你不能存儲這個字符串,你可以嘗試創建一個存儲過程,一個視圖或者使用linq處理數據到對象(在這種情況下,使用EF應用所有過濾器,使用.ToList()獲取結果並應用使用常規的linq到對象的順序過濾器)。

請注意,如果您不簡化您的查詢並且客戶表很大,you'll face some performance issues