Вложенный запрос NHibernate в предложении FROM - PullRequest
0 голосов
/ 22 февраля 2011

У меня проблема с переводом запроса 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

1 Ответ

1 голос
/ 22 февраля 2011

Я не думаю, что SQL делает то, о чем вы думаете. Итерация ни для чего не используется.

В любом случае это кажется ненужным. Вы можете изменить WHERE на следующее, и у вас будет действительный SQL и HQL:

lic.RegNo IN
(
  SELECT
    MAX(g.RegNo)
  FROM
    Licence g
  GROUP BY
    g.Type,
    g.Number
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...