【问题标题】:How to use SQL Count() in QueryOver如何在 QueryOver 中使用 SQL Count()
【发布时间】:2011-09-16 11:09:48
【问题描述】:

我正在尝试使用 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() 列放入列表)。我不确定如何访问由 Count() 生成的数据列,只返回 1 的位置。它生成的 SQL 是:

SELECT   count(this_.SERNUM) as y0_,
         this_.SERNUM        as y1_
FROM     ITEM this_
GROUP BY this_.SERNUM

我不确定我是否以正确的方式处理这个问题,但希望有人能指出我。

【问题讨论】:

  • .Add(Projections.Count(x => x.Sernum).As("count"))

标签: nhibernate queryover


【解决方案1】:
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();

【讨论】:

  • 谢谢你,除了一些调整之外,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多