簡體   English   中英

實體框架Core Linq查詢過濾相關實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM