【发布时间】:2011-02-21 22:46:31
【问题描述】:
我在将 T-SQL 查询转换为 Nhibernate 查询时遇到问题 - 或者编写将返回相同结果但将用 NH 查询语言(HQL、Criteria、QueryOver、LINQ 正确编写)的查询 - 我不是真的关心)。
我想从 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 由 Type、Number 和 Iteration 创建(模式:{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,如果这可以在 hibernate 中完成,它应该很容易翻译成 nh
【问题讨论】:
标签: nhibernate hibernate