У меня довольно простой запрос на продажу, который потенциально может вернуть более 100 тыс. Строк в любом заданном запросе.(Упрощенный) запрос linq выглядит следующим образом:
var query = from adi in _repo.AccountingDocumentItems
select new Sales
{
TotalInclusive = adi.TotalInclusive,
Employees = adi.Employees.Select(x => x.FirstName + " " + x.LastName)
};
Поскольку продажу можно назначить нескольким сотрудникам, и мне нужна эта информация - я перетаскиваю здесь строку имен IEnumerable, чтобы я мог позжесоедините их запятыми.
Результирующий запрос выглядит так, как показано ниже, обратите внимание на последнюю строку, в которой он упорядочивается с помощью AccountingDocumentItemId - это происходит только при извлечении IEnumerable:
SELECT
[Project1].[AccountingDocumentItemId] AS [AccountingDocumentItemId],
[Project1].[C1] AS [C1],
[Project1].[TotalInclusive] AS [TotalInclusive],
[Project1].[C3] AS [C2],
[Project1].[C2] AS [C3]
FROM ( SELECT
[Extent1].[AccountingDocumentItemId] AS [AccountingDocumentItemId],
[Extent1].[TotalInclusive] AS [TotalInclusive],
1 AS [C1],
CASE WHEN ([Join1].[AccountingDocumentItemId] IS NULL) THEN CAST(NULL AS varchar(1)) ELSE [Join1].[FirstName] + N' ' + [Join1].[LastName] END AS [C2],
CASE WHEN ([Join1].[AccountingDocumentItemId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C3]
FROM [dbo].[AccountingDocumentItems] AS [Extent1]
LEFT OUTER JOIN (SELECT [Extent2].[AccountingDocumentItemId] AS [AccountingDocumentItemId], [Extent3].[FirstName] AS [FirstName], [Extent3].[LastName] AS [LastName]
FROM [dbo].[AccountingDocumentItemEmployees] AS [Extent2]
INNER JOIN [dbo].[Employees] AS [Extent3] ON [Extent3].[EmployeeId] = [Extent2].[EmployeeId] ) AS [Join1] ON [Extent1].[AccountingDocumentItemId] = [Join1].[AccountingDocumentItemId]
) AS [Project1]
ORDER BY [Project1].[AccountingDocumentItemId] ASC, [Project1].[C3] ASC
Обычно этохорошо, он выполняется довольно хорошо, но сортировка в этом запросе становится тем хуже, чем больше столбцов я пытаюсь получить.Таким образом, проблема в том, что SQL Server приходится выполнять очень дорогую операцию сортировки, особенно когда число строк начинает превышать 100 тыс.
Я бы хотел избежать этого, но я не вижу никакихДругой способ получить сотрудников за продажу.Я попытался сгруппировать по AccountingDocumentItemId, а затем сгруппировать в самом C #, но производительность для этого на 100k + строках ужасна.
Как я могу реструктурировать этот запрос, чтобы избежать сортировки, но при этом возвращать IEnumerable имен сотрудников