У меня есть запрос, который полностью переводится в SQL. По неизвестным причинам LINQ решает последний Select()
выполнить в .NET(не в базе данных), что приводит к запуску большого количества дополнительных SQL-запросов (для каждого элемента) к базе данных.
На самом деле, я нашел странный способ принудительного перевода на SQL:
У меня есть запрос (это действительно упрощенная версия, которая по-прежнему не работает должным образом):
MainCategories.Select(e => new
{
PlacementId = e.CatalogPlacementId,
Translation = Translations.Select(t => new
{
Name = t.Name,
// ...
}).FirstOrDefault()
})
Он будет генерировать множество SQL-запросов:
SELECT [t0].[CatalogPlacementId] AS [PlacementId]
FROM [dbo].[MainCategories] AS [t0]
SELECT TOP (1) [t0].[Name]
FROM [dbo].[Translations] AS [t0]
SELECT TOP (1) [t0].[Name]
FROM [dbo].[Translations] AS [t0]
...
Однако, если я добавляю еще один Select()
, который просто копирует всех членов:
.Select(e => new
{
PlacementId = e.PlacementId,
Translation = new
{
Name = e.Translation.Name,
// ...
}
})
Он скомпилирует его в один оператор SQL:
SELECT [t0].[CatalogPlacementId] AS [PlacementId], (
SELECT [t2].[Name]
FROM (
SELECT TOP (1) [t1].[Name]
FROM [dbo].[Translations] AS [t1]
) AS [t2]
) AS [Name]
FROM [dbo].[MainCategories] AS [t0]
Любые подсказки почему? Как заставить LINQ to SQL генерировать один запрос более общий (без второго копирования Select()
)?
ПРИМЕЧАНИЕ. Я обновил запрос, чтобы сделать его очень простым.
PS: Только идея, которую я получаю, - это выполнить пост-обработку/преобразование запросов с похожими шаблонами (чтобы добавить еще один Select()
).