[英]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:您的
Order
和OrderItem
类应如下所示:
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.