实体框架 - 由同一列中的多个条件选择 - 引用表

时间:2012-04-20 16:36:09

标签: c# linq entity-framework linq-to-entities

示例场景:
两个表:订单 orderItem ,关系一对多。
我想选择所有至少有一个orderItem的价格为100且至少有一个orderItem的价格为200的订单。 我可以这样做:

var orders = (from o in kontextdbs.orders
              join oi in kontextdbs.order_item on o.id equals oi.order_id
              join oi2 in kontextdbs.order_item on o.id equals oi2.order_id
              where oi.price == 100 && oi2.price  == 200
              select o).Distinct();      

但如果这些条件是用户生成的呢? 所以我不知道会有多少条件。

2 个答案:

答案 0 :(得分:1)

您需要使用WhereAny方法遍历所有值,如下所示:

List<int> values= new List() { 100, 200 };

var orders = from o in kontextdbs.orders
             select o;
foreach(int value in values)
{    
      int tmpValue = value;
      orders = orders.Where(x => kontextdbs.order_item.Where(oi => x.id == oi.order_id)
                                                      .Any(oi => oi.price == tmpValue));    
}

orders = orders.Distinct();

答案 1 :(得分:0)

List<int> orderValues = new List() { 100, 200 };

ObjectQuery<Order> orders = kontextdbs.Orders;
foreach(int value in orderValues) {
    orders = (ObjectQuery<Order>)(from o in orders
                                  join oi in kontextdbs.order_item
                                    on o.id equals oi.order_id
                                  where oi.price == value
                                  select o);
}
orders = orders.Distinct();

应该工作,或者至少这是一般模式 - 你可以在每个阶段对IObjectQueryables应用额外的查询。

请注意,根据我的经验,使用EF生成这样的动态查询会产生糟糕的性能 - 不幸的是 - 它会在第一次获得特定模式时花费几秒钟将每个编译成SQL。如果订单值的数量相当稳定,那么这个特定的查询应该可以正常工作。