Я только что начал с NHibernate (используя SQLite) в моем текущем проекте, и я в основном использовал Query<>
, потому что мне было знакомо писать db-запросы в Linq.
Когда я столкнулся с некоторыми более сложными запросами, я провел некоторое исследование в QueryOver<>
и понял, что он должен быть предпочтительнее Query<>
, потому что "синтаксис QueryOver является специфичным для NH". Кроме того, нет ничего, что Query<>
может сделать, что QueryOver<>
не может выполнить.
Итак, я начал заменять все обычаи Query<>
соответственно. Это было незадолго до того, как у меня появилась первая "проблема", где использование Query<>
казалось просто более удобным.
Пример (выберите наибольшее значение из столбца CustomNumber
в таблице BillingDataEntity
):
int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault();
int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();
То, что мне не нравится, - это необходимость явно передать результат в int и что версия Query < > просто легче читать. Я получаю запрос совершенно неправильно или, другими словами: есть ли лучший способ сделать это?
Я посмотрел на сгенерированный вывод SQL:
NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1
NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]
Что именно я смотрю? Является ли это "внутренним" (зависящим от метода) запросом, который NHibernate далее переводит в фактический запрос к базе данных?