Подтвердить что ты не робот

Компромиссы с использованием NHibernate 3.0 QueryOver или LINQ-провайдера

Я не нашел четкого сравнения того, что поддерживается с NHibernate 3.0 LINQ Provider по сравнению с использованием синтаксиса QueryOver. С поверхности это кажется двумя большими усилиями в двух очень похожих вещах.

Каковы основные компромиссы для использования каждого?

4b9b3361

Ответ 1

LINQ и QueryOver - это совершенно разные методы запросов, которые добавляются к тем, которые существовали в NHibernate 2 (Criteria, HQL, SQL)

QueryOver подразумевается как строго типизированная версия Criteria и поддерживает в основном те же конструкции, которые являются специфичными для NHibernate.

LINQ - это "стандартный" метод запросов, что означает, что клиентский код может работать с IQueryable без явных ссылок на NHibernate. Он поддерживает другой набор конструкций; было бы трудно сказать, есть ли больше или меньше, чем с QueryOver.

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

Ответ 2

Я использовал обоих поставщиков NH-Linq (старый NHContrib для версии 2.1, а также новый для NH3.0), а также использовал QueryOver. Со всем опытом, накопленным во время разработки довольно сложных приложений, управляемых данными, я настоятельно рекомендую НЕ использовать существующий linq-provider с nHibernate, если вы планируете отказаться от базовых CRUD-операций!

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

Несмотря на все эти недостатки, я никогда не сталкивался с неправильными запросами. Поэтому, если вы не заботитесь о производительности и уже знакомы с LINQ, перейдите на NH-Linq. В противном случае QueryOver - ваш реальный и типичный друг.

Ответ 3

LINQ to NHibernate (начиная с версии 3.0) не поддерживает свойство .HasValue в типах Nullable. Нужно сравнивать с нулевым значением в запросах.

Ответ 4

Я начал использовать NH-Linq, потому что я уже работал с LinqToSql и Entity Framework. Но для более сложных запросов я всегда заканчивал работу с QueryOver. Причины:

  • Случается, что запрос с NH-Linq работает не так, как ожидалось. Я точно не помню, но это не работает с некоторыми сложными запросами. Кажется, это слишком молодо. И как сказал dlang в предыдущем ответе, он создает неэффективный SQL.
  • Когда вы изучаете QueryOver, легко вызвать функции, делать проекции, подзапросы, мне кажется более легкими, чем с NH-Linq.
  • Хорошо для NH-Linq - он может быть расширен, как рассказал Фабио Моло здесь. Но, похоже, это вполне возможно с QueryOver, но не столь фантастично, как с NH-Linq:)