【问题标题】:Entity framework - select by multiple conditions in same column - referenced table实体框架 - 通过同一列中的多个条件选择 - 引用表
【发布时间】:2012-04-22 16:30:34
【问题描述】:

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

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();      

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

【问题讨论】:

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


    【解决方案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();
    

    【讨论】:

      【解决方案2】:
      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。如果订单值的数量相当稳定,那么这个特定的查询应该可以正常工作。

      【讨论】:

      • 这会查找价格为 100 或 200 的所有订单。
      • 不,我刚刚对此进行了测试,对我来说效果很好。我每次都在对象查询之上编写一个额外的过滤器——它怎么能用来构造一个 OR? Aducci 的做法完全相同——如果他得到 AND 没有,或者你能解释一下这段代码怎么不会吗? (我可能更喜欢他的回答——我不应该自己尝试使用类似 SQL 的语法并坚持我所知道的——但这很好用。)
      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 2013-01-25
      • 2013-11-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多