Компромиссы с использованием 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:)