Как заставить Linq-To-Sql использовать Outer Apply - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь создать запрос linq, который дает мне список со столбцом чисел из основной таблицы с количеством подробных записей. Моя проблема в том, что linq выдает запрос без внешнего применения, которое заставляет запрос занимать 15 секунд. Если я сам создаю SQL-запрос с использованием внешнего применения, этот же запрос занимает меньше секунды.

TekMas.Select(x => new {x.TekNr,Cnt = x.TekRev.Count})

Это создает следующий sql

SELECT 
    [Extent1].[TekMasID] AS [TekMasID], 
    [Extent1].[TekNr] AS [TekNr], 
    (SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[TekRev] AS [Extent2]
        WHERE [Extent1].[TekMasID] = [Extent2].[TekMasID]) AS [C1]
    FROM [dbo].[TekMas] AS [Extent1]

Я пытаюсь создать следующий SQL с помощью linq

SELECT  TekMas.TekNr, RevCnt.Cnt
FROM    TekMas
            OUTER APPLY ( SELECT    COUNT (TekRevID) AS Cnt
                                        FROM    TekRev
                                        WHERE TekRev.TekMasID = TekMas.TekMasID) RevCnt;

Я знаю, что могу создатьВнешнее применение с использованием только первой подробной записи, подобной этой

TekMas.Select(x => new { x.TekNr, Cnt = x.TekRev.FirstOrDefault() })
.Select(x => new { x.TekNr, x.Cnt.TekRevID, x.Cnt.TekRevInf })

Этот linq создает следующий результат SQL

SELECT 
    [Extent1].[TekMasID] AS [TekMasID], 
    [Extent1].[TekNr] AS [TekNr], 
    [Limit1].[TekRevID] AS [TekRevID], 
    [Limit1].[TekRevInf] AS [TekRevInf]
    FROM  [dbo].[TekMas] AS [Extent1]
    OUTER APPLY  (SELECT TOP (1) 
        [Extent2].[TekRevID] AS [TekRevID], 
        [Extent2].[TekRevInf] AS [TekRevInf]
        FROM [dbo].[TekRev] AS [Extent2]
        WHERE [Extent1].[TekMasID] = [Extent2].[TekMasID] ) AS [Limit1]

Существует ли решение заставить linq создавать внешнее применение при использованиирассчитывать, как это происходит с FirstOrDefault () в последнем примере

Спасибо, Стивен

...