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

NHibernate3 Query vs QueryOver

Я заметил, что есть два способа создать хороший общий доступ к nhibernate.

IQueryOver<T, T> query= session.QueryOver<T>().Where(criteria);

и

IQueryable<T> query= session.Query<T>().Where(criteria);

Реализации каждого интерфейса.

IQueryOver<TRoot, TSubType> : IQueryOver<TRoot>, IQueryOver

и

IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable

IQueryable реализует IEnumerable, таким образом, поддерживает все удобные для LINQ вещи, которые вы ожидаете. Я стремлюсь к этой реализации, но задавался вопросом, знал ли кто-нибудь, что цель QueryOver заключается в том, что вы не можете выполнить с Query?

4b9b3361

Ответ 1

QueryOver объединяет методы расширения и лямбда-выражения:

IList<Cat> cats =
    session.QueryOver<Cat>()
        .Where(c => c.Name == "Max")
        .List();

QueryOver - это строго типизированная технология запросов, основанная на API-интерфейсе NHibernates Criteria.

Вы можете прочитать здесь здесь и здесь.

Насколько я знаю, некоторые функции в linq-провайдере еще не реализованы.
Я бы использовал QueryOver.
Это позволяет вам писать элегантный код, и он полностью доступен.

Что-то стоит чтение.

Ответ 2

Синтаксис

QueryOver - это NHibernate, поэтому он имеет множество мощных методов, которые вы просто не можете сопоставить в LINQ.

Как сказал LeftyX, реализация LINQ для NH не завершена, и у меня было несколько головных болей. Например, в последнее время у меня были проблемы с использованием кеша второго уровня, значений Future и NH Spatial extensions с LINQ, из-за неполной реализации или ошибок (и не говоря уже о производительности некоторого сгенерированного SQL, что иногда довольно ужасно).

Во всех этих случаях мне приходилось использовать QueryOver, и после превзойти кривую обучения, имеет, IMHO, гораздо более хороший синтаксис, чем LINQ.

Но LINQ через Запрос также имеет преимущества; например, ORM agnostic (который может использовать более чистую архитектуру репозитория), а для простых запросов более чем достаточно.