LINQ to SQL .Count занимает много времени процесса и снижает производительность - PullRequest
1 голос
/ 02 мая 2010

LINQ to SQL .Count занимает много времени процесса и снижает производительность.

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

Счетчик слишком медленный 8 мс :( для 120 родительских записей.

Любые идеи, чтобы сделать это быстрее.

Ответы [ 2 ]

2 голосов
/ 02 мая 2010

Для меня это звучит так, как будто вы просматриваете набор результатов, выполняя другой запрос Linq-to-sql для каждого результата. В этом случае он будет медленным, так как вы будете выполнять много дополнительных обходов базы данных.

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

2 голосов
/ 02 мая 2010

Вы можете выбрать проекцию из вашей базы данных, получив родительский элемент и количество дочерних элементов, которые у него есть. Это позволяет избежать обратного отключения к базе данных.

var query = from x in DataContext.Parents 
            select new {Parent = x, Count = x.Childs.Count() };

Теперь переберите результаты и переходите к следующему.

Если вы просто хотите фильтровать (= предложение where) по количеству дочерних элементов, сделайте это следующим образом:

var query = from x in DataContext.Parents 
            where c.Childs.Count() > 10
            select x;

Linq to SQL попытается преобразовать ваши вызовы в IEnumerable.Count() в SELECT COUNT(*), что должно быть довольно производительным.

...