LINQ查询相关属性中的ofType

时间:2013-04-28 18:40:13

标签: linq entity-framework asp.net-mvc-4

如何通过相关属性中的“OfType”过滤LINQ查询?

示例:我正在OrderLines集合中搜索包含匹配的productID列表中的产品的订单行。我想用contains来完成这个:

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

但是,我只想选择与SalesOrder相关的订单行,而不是选择采购订单。因此OrderLines.Document需要ofType<SalesOrder>

如何将其用于linq查询?

我尝试了getType但是出现了这个错误:     “LINQ to Entities无法识别方法'System.Type GetType()'方法,并且此方法无法转换为商店表达式。”

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:0)

如果有问题的情况没有反转 - 比如,没有从“一个”到“多个”的导航属性,只有另一种方式,并且你没有地方可以添加它 - 使用Contains可以实现类似的效果。

假设在此示例中,Lines上没有Document属性。

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