2013-04-28 95 views
3

如何通過相關屬性中的「OfType」過濾LINQ查詢?LINQ查詢相關屬性中的ofType

示例:我在OrderLines集合中搜索包含productID匹配列表中的產品的訂單項。我想用含有做到這一點:

OrderLines.Where(o => productIDs.contains(o.ProductID)) 

不過,我想只能選擇相關的SalesOrder,而不是一個採購訂單orderlines。所以OrderLines.Document將需要ofType<SalesOrder>

我如何工作到linq查詢?

我嘗試的getType但得到這個錯誤:「LINQ實體無法識別方法‘的System.Type的GetType()’方法,和這種方法不能被翻譯成存儲表述」

回答

2

濾波器Order秒,然後他們OrderLine S:

from o in Orders.OfType<SalesOrder>() 
from ol in o.OrderLines.Where(ol => productIDs.Contains(ol.ProductID)) 

這是一樣的

Orders.OfType<SalesOrder>().SelectMany(o => 
     o.OrderLines.Where(ol => productIDs.Contains(ol.ProductID))) 
+0

= _productionContext .Documents.OfType () .SelectMany(O => o.Lines)。凡(p值=> productIDs.Contains(p.ProductID))ToList(); – 2013-04-28 18:50:36

+0

正確。可能會生成相同的SQL查詢。 – 2013-04-28 18:51:53

0

如果有問題的情況下不具有反轉 - 比方說,有ISN從「one」到「many」的導航屬性,只有另一種方式,並且您無法添加它 - 使用Contains可以實現類似的效果。

假設在這個例子中,Document上沒有Lines屬性。

var salesOrders = _productionContext.Documents.OfType<SalesOrder>(); 
var result = OrderLines.Where(o => 
    productIDs.Contains(o.ProductId) 
    && salesOrders.Contains(o.Document));