Компромиссы с использованием NHibernate 3.0 QueryOver или поставщика LINQ

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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