如何在QueryOver中使用SQL Count()

时间:2011-09-16 11:09:49

标签: nhibernate queryover

我正在尝试使用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

我不确定我是否正确地接近这一点,但希望有人可以指出我。

1 个答案:

答案 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();