我正在尝试使用NHibernate中的QueryOver执行一些简单的SQL(使用sql server 2005)。查询是计算在项目列表中重复使用序列号的次数,然后选择仅使用1次的序列号。请注意,我不想要不同的序列号,因为我不想使用> 1使用的序列号。
执行此操作的SQL查询是:
SELECT SERNUM, expr1
FROM (SELECT SERNUM, COUNT(SERNUM) AS expr1
FROM ITEM
GROUP BY SERNUM) AS derivedtbl_1
WHERE (expr1 = 1)
到目前为止,我使用QueryOver所做的是:
var query = session.QueryOver<Item>()
.Select(Projections.ProjectionList()
.Add(Projections.Count<Item>(x => x.Sernum))
.Add(Projections.GroupProperty("Sernum"))).List();
此代码生成SQL(尽管它不喜欢将Count()列放到List中)。我不确定如何访问Count()生成的数据列,只说返回它所在的位置。它生成的SQL是:
SELECT count(this_.SERNUM) as y0_,
this_.SERNUM as y1_
FROM ITEM this_
GROUP BY this_.SERNUM
我不确定我是否正确地接近这一点,但希望有人可以指出我。
答案 0 :(得分:3)
var serials = session.QueryOver<Item>()
.Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1));
.Select(Projections.GroupProperty<Item>(i => i.Sernum))
.List();
应生成类似
的内容SELECT SERNUM FROM ITEM GROUP BY SERNUM HAVING COUNT(*) = 1
获取项目,执行类似
的操作var subquery = QueryOver.Of<Item>()
.Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1));
.Select(Projections.GroupProperty<Item>(i => i.Sernum));
var items = QueryOver.Of<Item>()
.WithSubquery.Where(i => i.Sernum).In(subquery);
.List();