簡體   English   中英

如何在子集合上使用 where 條件創建分層查詢

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

我有這個 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 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; }
}

查詢必須返回IQueryable<T> ,其中 T 不能是平面結構。 它必須是一個層次結構,就像 Order/OrderItem

您的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));

現在,您擁有所有訂單,其中每個訂單項目都具有SomeFlag屬性的true值。

在 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