У меня есть запрос, который полностью переводим в 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()
).