gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:38:50 24 4
gpt4 key购买 nike

我试图在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com