【问题标题】:How do I create hierarchical query with where condition on the children collection如何在子集合上使用 where 条件创建分层查询
【发布时间】:2021-07-14 11:24:56
【问题描述】:

我有这个 SQL 查询:

SELECT * 
FROM Orders o 
INNER JOIN OrderItems i on o.Id = i.OrderId
WHERE i.SomeFlag = 0

如何将此 SQL 转换为 EF 分层查询,该查询将返回带有 OrderItems 作为子集合的 Orders?

重要提示:注意 OrderItems 的 where 条件!

EF模型如下:

class Order 
{
   public int Id { get; set; }
   public List<OrderItem> OrderItems { get; set; }
}
class OrderItem {
   public int OrderId { get; set; }
   public int ProductId { get; set; }
   public bool SomeFlag { get; set; }
   public Order Order { get; set; }
}

class MyDbContext : DbContext 
{
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderItems> OrderItems { get; set; }
}

查询必须返回IQueryable&lt;T&gt;,其中 T 不能不是平面结构。它必须是像 Order/OrderItem 一样的层次结构

【问题讨论】:

  • OrderItem 类是什么样的?
  • 错字:2 个在 DbContext 中同名的属性。
  • 也许理解错了,但是:db.Orders.Where(..).Include(o =&gt; o.OrdersItems)。将加载相关实体 但是我们不是在这里讨论这个,对吧?参考:EF.Core Loading Related Data.
  • 使用 SelectMany : context.Orders.SelectMany(x => x.OrderItmes.Select(y => new {id = x.Id, item = y.OrderItems}).ToList();
  • @Self:你会如何写 where 条件?请注意,我想根据 OrderItems 进行过滤。我注意到现在支持过滤包含,这几乎是我所需要的,除了它执行外连接并且我需要内连接或等效项

标签: c# linq entity-framework-core .net-5


【解决方案1】:

您的 OrderOrderItem 类应如下所示:

class Order 
{
  public int Id { get; set; }

  // Navigation property  
  public IColection<OrderItem> OrderItems { get; set; }
}

class OrderItem
{
  public int Id { get; set; }
  public int OrderId { get; set; }

  // Navigation property  
  public Order Order { get; set; }
}

class MyDbContext : DbContext 
{
  ...

  public DbSet<Order> Orders { get; set; }
  public DbSet<OrderItem> OrderItems { get; set; }
}

查询:

_context.Orders.Include(x => x.OrderItems).Where(x => x.OrderItems.Any(q => q.SomeFlag));

现在您拥有所有订单,其中每个订单项目的所有订单项目都具有 true 属性的 SomeFlag 值。

在 EF5 及更高版本中,您可以使用 Filtered Include 例如:

_context.Orders.Include(x => x.OrderItems.Where(x => x.SomeFlag));

【讨论】:

  • WHERE 条件在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2012-05-18
  • 2019-11-19
相关资源
最近更新 更多