原始 SQL 對單個表使用相關子查詢,是否有可能使用單個 LINQ 查詢來翻譯它?
SELECT * From dbo.Products AS P1
WHERE SalePrice > (SELECT AVG(SalePrice)
FROM dbo.Products AS P2
WHERE P1.Type = P2.Type GROUP BY Type)
它按型別對產品進行分組,并選擇 SalePrice 大于型別組平均值的產品。LINQ 資料源是一個 EFCore DbSet。
uj5u.com熱心網友回復:
from product in products.AsEnumerable()
group product by product.Type into typeGroup
from product in typeGroup
where product.SalePrice > typeGroup.Average(product => product.SalePrice)
select product;
注意:
第二個從頭開始的sql中的產品與第一個不同。
EFCore6 無法在 IQueryable 上轉換此 LINQ 所以我們使用 AsEnumerable(),它將所有產品資料都放入記憶體。所以也許原始的sql應該更好。
像另一個答案一樣將其拆分為兩個查詢將解決問題并使其更具可讀性。
原因是 IQuerable.GroupBy() 不能作為 EF6 的最終運算子,計劃在 EFCore 7 進行改進。防止 GroupBy() 成為最終運算子。解決方案是:
var query =
from product in products
join typeGroup in
from product in products
group product by product.Type into typeGroup
select new { Type = typeGroup.Key, Average = typeGroup.Average(p => p.SalePrice) }
on product.Type equals typeGroup.Type
where product.SalePrice > typeGroup.Average
select product;
uj5u.com熱心網友回復:
嘗試以下查詢:
var products = context.Products;
var grouped =
from p in products
group p by p.Type into g
select new
{
Type = g.Key,
Average = g.Average(x => x.SalePrice)
};
var query =
from p in products
join g in grouped on p.Type equals g.Type
where p.SalePrice > g.Average
select p;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/461156.html
上一篇:如何在LINQ中放置條件
下一篇:存盤程序:回傳一周的前五天
