Linq2SQL групповая и суммированная оптимизация - PullRequest
0 голосов
/ 09 марта 2012

Я бьюсь головой об этом уже некоторое время. Я хочу добиться этого:

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.

Этот дополнительный подзапрос существует только тогда, когда имеется более одного объединения после группы, поэтому, если я удаляю одно из них, запрос генерирует ожидаемый SQL.

ПРИМЕЧАНИЕ. Я сократил исходный запрос, чтобы просто сохранить части, которые генерируют это поведение, чтобы было легче следовать.

1 Ответ

0 голосов
/ 09 марта 2012

Я не проверял это, но это может помочь:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...