【问题标题】:Entity framework - select by multiple conditions in same column - Many to Many实体框架 - 在同一列中按多个条件选择 - 多对多
【发布时间】:2012-05-02 22:49:05
【问题描述】:

我在这里问了非常相似的问题
Entity framework - select by multiple conditions in same column - referenced table

现在关系是多对多。 所以我有 3 个表:order、items 和 orderItem(items 是一个 Junction 表) 再次.. 我想选择所有订单至少有一个价格为 100 的 orderItem 和至少一个价格为 200 的 orderItem

我真的不知道如何针对这种情况进行编辑。

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)
} 

【问题讨论】:

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


    【解决方案1】:

    首先,你可以这样声明:

    var orders = kontextdbs.orders;
    

    无需使用实际的 select 语句。

    要回答您的实际问题,您应该可以这样做:

    foreach(int value in values)
    {
        var temp = value;
    
        orders = orders.Where(o => o.order_item.Any(oi => oi.price == temp));
    }
    

    这假设您有一个从orderorder_item 的导航属性。

    【讨论】:

    • 嗯.. 我没有从 order 到 order_item 的导航属性。如何手动加入 items 表,然后加入 order_item 表?
    • 为什么没有导航属性?
    • @AdamRobinson - 可能是因为他没有定义外键。
    • 其实这个场景是假设的。(我应该写的,对不起)我只有一对多关系的 order 和 order_item 表。我只是想知道多对多的情况如何。那么EF会创建导航属性吗?那挺好的。但是仍然......我想知道没有它我怎么能做到这一点。 (我只是好奇,我真的很想知道)
    【解决方案2】:

    已更新,因为您没有导航属性(您应该修复它。)

    如果要选择价格为 100 或 200 的订单,可以使用:

    var qMyOrders = 
    from a in kontextdbs.orders
    join b in kontextdbs.order_items on a.id equals b.order_id
    where values.Contains(b.price)
    select a;
    

    如果您需要查找其订单商品与数组中所有价格(例如 100 和 200)匹配的订单,请使用以下命令:

    var qMyOrders = 
    from a in kontextdbs.orders
    from b in kontextdbs.order_items.Where( c => c.order_id == a.id )
    where values.All(d => b.price == d)
    select a;
    

    【讨论】:

      【解决方案3】:

      这是修改后的版本

      foreach(int value in values)
      {    
            int tmpValue = value;
            orders = orders.Where(x => (from oi in kontextdbs.order_item
                                       join i in kontextdbs.items on oi.item_id equals i.id
                                       where x.id == oi.order_id
                                       select i).Any(y => y.price == tmpValue));    
      }
      

      【讨论】:

      • 再一次..就是这样 :) 非常感谢。
      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2018-02-03
      • 2013-11-01
      • 1970-01-01
      • 2023-03-22
      • 2013-01-25
      相关资源
      最近更新 更多