[英]Entity Framework Core Linq query to filter related entity
我一直在研究如何在使用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中它將是:隱藏復制代碼
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這樣的基本實體類來過濾屬性,但是我不知道如何使用Include / ThenInclude來處理相關實體,就像在OrderDetail.ProductName上過濾一樣, 我一直在研究很多,但仍然沒有線索,因此最后我必須使用Store程序 ,這是大多數開發人員不推薦的。
也許一個linq sql可以做到這一點?
請幫助我了解更多相關信息! 非常感謝能分享您知識的每個人!
您可以簡單地將SQL腳本翻譯為linq:
var orders = (from O in context.Order
join OD in context.OrderDetail on O.OrderId equals OD.OrderId
where O.CreatedBy == "Jason" && OD.ProductName == "Apple"
select order).Distinct().ToList();
//or this solution
orders = context.Set<Order>().Include(p => p.OrderDetails)
.Where(x => x.CreatedBy == "Jason" && x.OrderDetails.Any(y => y.ProductName == "Apple"))
.ToList();
@Slava的回答看起來很正確。 但我想擴展他的答案。 如果要在查詢中使用like
,可以使用EF.Functions.Like
方法。 它在內存方面較便宜並且處理復雜的表達式。 您可以在場景中使用相同的內容,如下面的代碼。 在關系數據庫上,這通常直接轉換為SQL。
var orders = (from O in context.Order
join OD in context.OrderDetail on O.OrderId equals OD.OrderId
where EF.Functions.Like(O.CreatedBy, "Jason") && EF.Functions.Like(OD.ProductName, "Apple")
select order).Distinct().ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.