Получите реальный счет коллекции IQueryable после Distinct () - PullRequest
0 голосов
/ 06 октября 2011

Мой код:

IQueryable<string> keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct();
int count = keys.Count();

Коллекция keys имеет нормальную коллекцию после отличного, это хорошо.Но в keys.Count() у меня есть количество всех строк таблицы без четких.Мой ORM - это NHibernate.

Что я могу сделать, чтобы иметь реальный счет коллекции IQueryable? (без приведения к другим типам коллекций)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Если вызов Count () не преобразован в SQL-запрос, который выбирает только счетчик, метод расширения Count () все равно должен перечислить все объекты.Поскольку вы поместили ключи в переменную, я полагаю, что она вам понадобится позже, возможно, перечисляя ее.Таким образом, вы можете получить их все прямо здесь, вот так

string[] keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct().ToArray();
int count = keys.Length;

Но мне любопытно, в вашем примере, что это дает (запрос и результат):

int count = dr.Localization.GetQuery().Select(x => x.Key).Distinct().Count();
0 голосов
/ 06 октября 2011

Похоже, ваш провайдер с ошибками содержит ошибку, вам, вероятно, следует сообщить об этой ошибке.

В то же время, одним из способов правильного подсчета будет использование keys.AsEnumerable().Count(). НО, это повлечет за собой оценку всей коллекции. Таким образом, если в полученной коллекции много элементов, вы получите их все только для подсчета.

Другой вариант, который вы можете попробовать, - это использовать что-то вроде keys.GroupBy(k => k).Count() или, возможно, то же самое без Distinct() и надеяться, что в этом случае такой же ошибки нет.

...