简体   繁体   English

如何在子集合上使用 where 条件创建分层查询

[英]How do I create hierarchical query with where condition on the children collection

I have this SQL query:我有这个 SQL 查询:

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

How do I turn this SQL into an EF hierarchical query that would return Orders with the OrderItems as child collection?如何将此 SQL 转换为 EF 分层查询,该查询将返回带有 OrderItems 作为子集合的 Orders?

IMPORTANT: Notice the where condition on OrderItems!重要提示:注意 OrderItems 的 where 条件!

EF Model is as follows: EF Model如下:

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

The query must return IQueryable<T> where T cannot not be flat structure.查询必须返回IQueryable<T> ,其中 T 不能是平面结构。 It must be a hierarchy just like Order/OrderItem它必须是一个层次结构,就像 Order/OrderItem

Your Order & OrderItem classes should be look like:您的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; }
}

For Query:查询:

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

Now you have all orders with all order items for each one with true value for SomeFlag property.现在,您拥有所有订单,其中每个订单项目都具有SomeFlag属性的true值。

In EF5 and above you can use Filtered Include such as:在 EF5 及更高版本中,您可以使用过滤包含,例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM