nhibernate - 如何在 QueryOver 中使用 SQL Count()

标签 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() 列放入列表)。我不确定如何访问 Count() 生成的数据列以仅返回 1。它生成的 SQL 是:

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

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

最佳答案

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

关于nhibernate - 如何在 QueryOver 中使用 SQL Count(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7443796/

相关文章:

c# - 表 X 中的关联引用未映射的类 : System. Guid

NHibernate 3.3 : composite-id with a key-property generated?

nhibernate - 使用 NHibernate 和 Codesmith 生成 ORM

join - NHibernate (+ FluentNhibernate) : Join two detached tables

c# - QueryOver 集合包含所有值

c# - 在 GenericADOException 之后尝试 Session.GetAll 时, "MyEntityType"条目中的空 ID(发生异常后不刷新 session )

c# - 如何比较 lambda 表达式与 QueryOver where 限制中的别名属性?

c# - nhibernate queryOver 投影语法

c# - NHibernate 3.2 QueryOver 按属性区分

c# - 实体->接口(interface)关系,如何映射