Компромиссы с использованием NHibernate 3.0 QueryOver или поставщика LINQ - PullRequest
44 голосов
/ 06 октября 2010

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

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

Ответы [ 4 ]

36 голосов
/ 06 октября 2010

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

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

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

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

16 голосов
/ 08 марта 2011

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

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

15 голосов
/ 29 декабря 2010

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

2 голосов
/ 12 октября 2011

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

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