我很久以来一直在想如何在使用Include时通过Entity Framework Core过滤相关实体的查询。假设我有以下两个类:
public class Order
{
public int OrderId {get; set;}
public String CreatedBy{get; set;}
public virtual Collection<OrderDetail> OrderDetails { get; set; } = new Collection<OrderDetail>();
}
public class OrderDetail
{
public Int64? OrderDetailID { get; set; }
public Int64? OrderID { get; set; }
public string ProductName { get; set; }
}
如果我想要查找所有由“Jason”创建的订单,并且订单详情中的产品名称等于“Apple”,在SQL中,它应该是这样的: Hide Copy Code
SELECT *
FROM Orders O
INNER JOIN OrderDetail OD ON O.OrderId = OD.OrderId
WHERE O.CreationUser = 'Jason' and OD.ProductName = 'Apple'
然而,我无法弄清如何使用EntityFramework编写此内容,类似以下内容将无法正常工作:
await DbContext.Set<Order>()
.Include(p => p.OrderDetails)
.Where(o => o.CreationUser == "Jason")
.Where(o => o.OrderDetails.Where(od => od.ProductName == "Apple"));
有这样的情况,我知道如何使用基本实体类(如上例中的Order)过滤属性,但是我不知道如何处理相关实体,比如在OrderDetail.ProductName上进行Include/ThenInclude过滤。我已经进行了很多研究,但仍然没有头绪,因此最后我只能使用存储过程,这并不是大多数开发人员推荐的方法。
也许可以使用Linq SQL来解决这个问题?
请帮助我更好地理解它!非常感谢每一个愿意分享知识的人!