Linq to Entities: счетчик очень медленный - PullRequest
3 голосов
/ 16 ноября 2010

Мне нужно иметь parent и parent.child.count () .... в запросе ... когда я делаю это, это занимает 20 секунд .... это не огромная база данных ... Есть идеи по оптимизации...

var plist = context.persons
  .Select(p => new
  {
    p.fullName,
    c.personID,
    p.Status,
    p.Birthdate,
    p.Accounts.Count
  }).ToList();

Ответы [ 6 ]

4 голосов
/ 16 ноября 2010

Вот отличная статья об использовании count (), когда вы действительно хотели использовать any ()

http://blogs.teamb.com/craigstuntz/2010/04/21/38598/

2 голосов
/ 17 ноября 2010

Судя по отправленному вами коду, похоже, что это не займет много времени.У меня есть несколько предложений:

  1. Используйте LinqPad для выполнения этого запроса.Это позволит вам увидеть генерируемый SQL.Затем запустите этот код SQL в SQL Server Management Studio и скажите, чтобы он включал фактический план выполнения.Это поможет вам узнать, есть ли конкретная точка в запросе, которая занимает много времени.Например, если у вас нет индекса в ссылке PersonId таблицы Account, этот запрос займет намного больше времени.
  2. Посмотрите, как вы используете эти данные.Очень редко вам действительно нужно одновременно хранить в памяти всех людей во всей вашей системе.На самом деле, я подозреваю, что простое извлечение всех данных этого человека из базы данных, вероятно, занимает гораздо больше времени, чем Count().
    • Отображаете ли вы эти данные?Если так, то не лучше ли «пейджировать» результаты, показывая только десять записей одновременно?Вы можете использовать метод .Take(int) перед вызовом .ToList(), чтобы получить столько записей, сколько вам нужно.
    • Если вы обрабатываете и агрегируете эти данные ради метрик сайта, вероятно, лучше установитьвыполнить запрос, чтобы вернуть конечный результат до его оценки.

Если вы можете описать, как используются эти данные, или предоставить снимок экрана с выполнением SQL, мы можемпредоставить больше отзывов.

2 голосов
/ 16 ноября 2010

Поскольку это структура сущностей, откройте SQL Server Profiler и посмотрите, какие SQL-запросы отправляются в базу данных.Похоже, вы можете видеть, что один запрос отправляется для получения идентификаторов группы, а затем другой набор запросов (один для каждой группы) может получить счетчик.Если это произойдет, вам придется опубликовать запрос linq, чтобы кто-то мог решить проблему.

2 голосов
/ 16 ноября 2010

Вам нужно использовать .count или вы можете использовать .any?

http://msdn.microsoft.com/en-us/library/bb534972.aspx

1 голос
/ 20 марта 2013

У меня была какая-то похожая проблема, я попробовал это и работал лучше:

child.count (x => x.paretnID == inputParentID) child.where (x => x.parentID ==inputParentID)

мой исходный код, который занимал около 15-20 секунд на каждой итерации, был: return (isEdit)?db.ChasisBuys.Single (x => x.ChasisBuyID == long.Parse (Request.QueryString ["chbid"])). Chasises.Count (y => y.Bikes.Count> 0 && y.ColorID == buyItems[(int) index] .ColorID && y.ChasisTypeID == buyItems [(int) index] .ChasisTypeID) .ToString (): "-";

новый работающий код:

        **return (isEdit) ? db.Chasises.Where(x => x.ChasisBuyID == long.Parse(Request.QueryString["chbid"])).Count(y => y.Bikes.Count > 0 && y.ColorID == buyItems[(int)index].ColorID && y.ChasisTypeID == buyItems[(int)index].ChasisTypeID).ToString() : "-";**

База данных содержит около 1000 записей в шасси, около 5 в chasisBuys и около 20 в байках.Мое мнение таково, что запросы Linq to SQL не выполняют предварительных оценок, таких как логические выражения, которые, например, если вы напишите «return a && b && c;»если утверждение a является ложным, другие операторы не оцениваются, и я ожидал такого в linq to sql, но это не так.

1 голос
/ 08 августа 2011

Я решил похожую проблему с помощью метода GroupBy.

IEnumerable> accounts = Accounts.GroupBy (x => x.personID);account.Count () вернет количество учетных записей, принадлежащих этому человеку.account.Key вернет personID группы.

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