[英]Linq2SQL group-by and sum optimisation
我已經在這上面敲了一段時間了。 我想實現這一目標:
SELECT [t2].[nArtKey], [t2].[value] AS [nQty]
FROM (
SELECT SUM([t0].[nQty]) AS [value], [t1].[nArtKey]
FROM [vdatStockTransactions] AS [t0]
INNER JOIN [regArtSKU] AS [t1] ON [t0].[nSKU] = [t1].[nSKU]
GROUP BY [t1].[nArtKey]
) AS [t2]
INNER JOIN [regArticles] AS [t3] ON [t2].[nArtKey] = [t3].[nArtKey]
INNER JOIN [regGroupConnector] AS [t4] ON [t2].[nArtKey] = [t4].[nArtKey]
WHERE [t2].[value] > @p0
到目前為止,我對LINQ所擁有的東西幾乎完全滿足了我的需求,數量方面...
from trans in context.vdatStockTransactions
join sku in context.regArtSKUs on trans.nSKU equals sku.nSKU
group trans by new { sku.nArtKey } into grp
where grp.Sum(g => g.nQty) > 0
join art in context.regArticles on grp.Key.nArtKey equals art.nArtKey
join ca in context.regGroupConnectors on grp.Key.nArtKey equals ca.nArtKey
select new
{
nArtKey = grp.Key.nArtKey,
//nQty = grp.Sum(g => g.nQty)
};
但是,如果我取消注釋nQty,則會得到以下信息:
SELECT [t7].[nArtKey], [t7].[value] AS [nQty]
FROM (
SELECT [t3].[nArtKey], (
SELECT SUM([t5].[nQty])
FROM [vdatStockTransactions] AS [t5]
INNER JOIN [regArtSKU] AS [t6] ON [t5].[nSKU] = [t6].[nSKU]
WHERE [t2].[nArtKey] = [t6].[nArtKey]
) AS [value], [t2].[value] AS [value2]
FROM (
SELECT SUM([t0].[nQty]) AS [value], [t1].[nArtKey]
FROM [vdatStockTransactions] AS [t0]
INNER JOIN [regArtSKU] AS [t1] ON [t0].[nSKU] = [t1].[nSKU]
GROUP BY [t1].[nArtKey]
) AS [t2]
INNER JOIN [regArticles] AS [t3] ON [t2].[nArtKey] = [t3].[nArtKey]
INNER JOIN [regGroupConnector] AS [t4] ON [t2].[nArtKey] = [t4].[nArtKey]
) AS [t7]
WHERE [t7].[value2] > @p0
為什么要創建額外的子查詢,有什么辦法可以避免呢? 它在性能上有很大的不同,所以我真的很想弄清楚這一點。 我想要的只是使用數量([t2]。[value])並將其放入SELECT語句。
只有在group by之后有多個連接時,才存在該額外的子查詢,因此,如果我刪除其中一個,則查詢將生成預期的SQL。
注意:我精簡了原始查詢,只保留了生成此行為的部分,因此更容易理解。
我還沒有測試過,但這可以解決問題:
var quantities =
from trans in context.vdatStockTransactions
group trans by trans.SKU.nArtKey into grp
select new
{
nQty = grp.Sum(g => g.nQty),
nArtKey = grp.Key
};
var results =
from quantity in quantities
join art in context.regArticles
on quantity.nArtKey equals art.nArtKey
join ca in context.regGroupConnectors
on quantity.nArtKey equals ca.nArtKey
where quantity.nQty > 0
select quantity;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.