簡體   English   中英

Linq2SQL分組和總和優化

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

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