Эффективный способ выбрать записи с детьми? - PullRequest
2 голосов
/ 30 июня 2011

У меня есть запрос LINQ to SQL, похожий на следующий ...

return from parent in Context.Parents
       where 
       (
          (parent.SomeProperty != null && parent.SomeProperty != "")
          ||
          (Context.Childs.Count(c => c.ParentID == parent.ID && c.Type == "SomeType") > 0)
       )
       select parent

Идея заключается в том, что я хочу найти все родительские записи, которые либо получили значение для SomeProperty, либо имеют дочерние записи типа SomeType.

Проблема в том, что время запроса истекло. Есть ли более быстрый (но все же легко читаемый) способ сделать то же самое?

Спасибо за чтение.

1 Ответ

4 голосов
/ 30 июня 2011

Используйте Any() вместо Count():

return from parent in Context.Parents
       where 
       (
          (parent.SomeProperty != null && parent.SomeProperty != "")
          ||
          Context.Childs.Any(c => c.ParentID == parent.ID 
                                  && c.Type == "SomeType")
       )
       select parent;

В Linq to SQL Count(<some condition>) переводится на:

SELECT COUNT(*) WHERE <some condition>

запрос, который требует итерации по всем строкам в базе данных, чтобы найти счетчик.

В Linq to SQL Any(<some condition>) переводится в

EXISTS (.. <some condition>)

подзапрос, который позволяет закорочить результат, как только найдено первое совпадение.

Точное сопоставление SQL можно найти в этом ответе SO: результат запроса, что я должен использовать Count () или Any ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...