2016-07-19 4 views
1

Я пытаюсь оптимизировать запрос, сгенерированный с помощью Entity Framework Linq to SQL Query. Ниже приведена упрощенная версия моего запроса.Entity Framework Optimize Count Child Entities

C#

List<bool> isUsed = Context.tParent.Select(parent => 
    parent.tChild.Any() 
).ToList(); 

Это приводит следующий SQL

генерируемый SQL

SELECT 
    CASE WHEN ((EXISTS (SELECT 
     1 AS [C1] 
     FROM [dbo].[tChild] AS [Extent2] 
     WHERE [Extent1].[Id] = [Extent2].[ParentId] 
    )) 
    ) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1] 
    FROM [dbo].[tParent] AS [Extent1] 

К сожалению, это работает плохо (мой реальный запрос проверяет количество на многих связанных таблиц), и если я переписываю запрос, как указано ниже, скорость очень велика reased.

Оптимизированного запрос

SELECT CASE WHEN (
    COUNT(tChild.Id) > 0 
) THEN 1 ELSE 0 END 
FROM tParent 
    LEFT JOIN tChild ON tParent.Id = tChild.ParentId 
GROUP BY tParent.Id 

Как я могу переписать мои C# для создания моего оптимизированного запроса, используя Linq для SQL запроса?

ответ

1

Ну, следующий LINQ к Entities запроса эффективно производит один и тот же SQL, как ваш Оптимизированный запрос. Это, в основном, один-на-один перевод SQL на LINQ, но IMO не очень интуитивно понятный способ описания цели запроса. Во всяком случае, вот он:

var query = 
    from parent in Context.tParent 
    from child in parent.tChild.DefaultIfEmpty() 
    group child by parent.Id into g 
    select g.Sum(child => child != null ? 1 : 0) > 0 ? true : false; 
+0

Я согласен, что это не лучший способ описать намерение запроса, но это исполнение, которое для моей текущей задачи это более важно. благодаря – Joe

0

это возвращение запрос, все родители, которые по крайней мере, один ребенок:

var result = Context.tChild.Select(child => child.tParent) 
    .Distinct().ToList(); 
Смежные вопросы