У меня проблема с переводом запроса T-SQL в запрос Nhibernate - или с написанием запроса, который будет возвращать те же результаты, но будет правильно написан на языке запросов NH (HQL, Criteria, QueryOver, LINQ - я не совсемcare).
Я бы хотел выполнить аналогичный запрос от NHibernate:
SELECT
lic.RegNo,
lic.ReviewStatus
FROM
Licence lic
WHERE
lic.RegNo IN
(
SELECT
grouped.RegNo
FROM
(
SELECT
g.[Type],
g.Number,
MAX(g.Iteration) AS [Iteration],
MAX(g.RegNo) AS [RegNo]
FROM
Licence g
GROUP BY
g.[Type],
g.Number
) as grouped
)
ORDER BY
lic.RegNo desc
Возвращает большинство лицензий и получает статус их отзыва, если таковой существует.RegNo создается из Типа, Числа и Итерации (шаблон: {0}{1:0000}-{2:00}
).Каждая лицензия может иметь несколько итераций, и некоторые из них могут содержать ReviewStatus, например:
W0004-01 NULL
W0001-03 1
P0004-02 3
P0001-02 4
Если часть итерации больше 1, это означает, что для конкретной лицензии есть несколько итераций (n).
Мне удалось создать запрос NH, дважды перейдя в базу данных:
LicenceInfoViewModel c = null;
var grouped = session.QueryOver<Licence>()
.SelectList(l => l
.SelectGroup(x => x.Type)
.SelectGroup(x => x.Number)
.SelectMax(x => x.Iteration)
.SelectMax(x => x.RegNo).WithAlias(() => c.RegNo)
).TransformUsing(Transformers.AliasToBean<LicenceInfoViewModel>())
.Future<LicenceInfoViewModel>();
var proper = session.QueryOver<Licence>()
.Select(x => x.RegNo, x => x.ReviewStatus)
.WhereRestrictionOn(x => x.RegNo)
.IsIn(grouped.Select(x => x.RegNo).ToArray())
.TransformUsing(Transformers.AliasToBean<LicenceInfoViewModel>())
.List<LicenceInfoViewModel>();
// ...
public class LicenceInfoViewModel
{
public string RegNo { get; set; }
public LicReviewStatus? ReviewStatus { get; set; }
}
public enum LicReviewStatus
{
InProgress,
Submitted,
Validated,
RequestForInformation,
DecissionIssued
}
Однако это решение не подходит, так как требует загрузки всех сгруппированных лицензий из базы данных, и может быть тысячиих.
Есть ли лучший способ написать этот запрос или есть способ перевести приведенный выше запрос T-SQL в NHibernate?
добавление тегов nhibernate и hibernate в качестве IMO, еслиэто можно сделать в спящем режиме, его легко перевести на nh