NHibernate - эквивалент проекции CountDistinct с использованием LINQ - PullRequest
1 голос
/ 11 августа 2009

Я пытаюсь заменить запросы критериев, которые я использую для многопольной поисковой страницы, запросами LINQ с использованием нового поставщика LINQ. Тем не менее, я столкнулся с проблемой получения количества записей, чтобы я мог реализовать пейджинг. Я пытаюсь добиться результата эквивалентно тому, который создается проекцией CountDistinct из Criteria API с использованием LINQ. Есть ли способ сделать это?

Метод Distinct (), предоставляемый LINQ, похоже, не работает так, как я ожидал, и добавляю ".Distinct (). Count ()" в конец запроса LINQ, сгруппированного по полю. count (столбец целочисленного идентификатора), кажется, возвращает нечеткое количество этих значений.

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 августа 2009

Я нашел способ сделать это, хотя он может быть не оптимальным во всех ситуациях. Простое выполнение .Distinct () для запроса LINQ фактически приводит к «отличному» результату SQL-запроса при использовании без .Count (). Если я вызову перечисление запроса с помощью .Distinct (). ToList (), а затем использую метод .Count () в полученной коллекции в памяти, я получу нужный результат.

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

Однако я надеюсь, что в будущем будет реализована истинная операция LINQ CountDistinct ().

0 голосов
/ 11 августа 2009

Вы можете попытаться выбрать столбец, для которого вы хотите получить различный счет. Это будет выглядеть примерно так: Select (p => p.id) .Distinct (). Count (). В нынешнем виде вы различаете весь объект, который сравнивает ссылку на объект, а не фактические значения.

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