gpt4 book ai didi

select - NHibernate QueryOver CASE WHEN 计算列值

转载 作者:行者123 更新时间:2023-12-01 21:13:06 25 4
gpt4 key购买 nike

我一直在尝试在 NHibernate QueryOver 中执行以下 T-SQL,但没有成功:

SELECT Id, SUM(CASE MyValue WHEN 1 THEN Volume ELSE Volume * -1 END)
FROM MyTable
GROUP BY Id

我正在尝试对所有交易量求和,但对于 MyValue=1 应该是正值,否则应该是负值。到目前为止我得到了:

 var result = this.Session.QueryOver<MyTable>()
.Select(Projections.Group<MyTable>(x => x.Id),
Projections.Conditional(Restrictions.Eq(Projections.Property<MyTable>(x
=> x.MyValue), '1'),
Projections.Property<MyTable>(x => x.Volume),
Projections.Property<MyTable>(x => x.Volume * -1)))
.List();

但是正如你可以想象的那样,NHibernate 不知道 Volume * -1 列,那么我如何在我的 CASE 中进行此计算?

最佳答案

我认为这应该可以解决问题:

session.QueryOver<MyTable>()
.Select(
Projections.Group<MyTable>(x => x.Id),
Projections.Sum(
Projections.Conditional(
Restrictions.Eq(
Projections.Property<MyTable>(x => x.MyValue), 1),
Projections.Property<MyTable>(x => x.Volume),
Projections.SqlFunction(
new VarArgsSQLFunction("(", "*", ")"),
NHibernateUtil.Int32,
Projections.Property<MyTable>(x => x.Volume),
Projections.Constant(-1)))))
.List<object[]>();

一般来说,QueryOver 的算术运算能力非常糟糕。据我所知,你必须使用VarArgsSQLFunction构建乘法表达式。

这会生成以下 SQL:

SELECT
this_.Id as y0_,
sum((
case when this_.MyValue = 1
then this_.Volume else (this_.Volume*-1) end
)) as y1_
FROM
MyTable this_
GROUP BY
this_.Id

请注意,您需要在此处使用与自定义 DTO 配对的结果转换器,或使用 .List<object[]> ,这会将结果集转换为 Listobject[]List 中的每一项是结果行。你不能只使用.List()因为 NHibernate 期望选择整个 MyTable行,您在这里没有这样做。

您可能认为这非常丑陋,我同意。您可以通过将投影重构为它们自己的变量来稍微清理它:

IProjection multiplicationProjection = 
Projections.SqlFunction(
new VarArgsSQLFunction("(", "*", ")"),
NHibernateUtil.Int32,
Projections.Property<MyTable>(t => t.Volume),
Projections.Constant(-1));

IProjection conditionalProjection =
Projections.Conditional(
Restrictions.Eq(
Projections.Property<MyTable>(t => t.MyValue), 1),
Projections.Property<MyTable>(t => t.Volume),
multiplicationProjection);

session.QueryOver<MyTable>()
.SelectList(list => list
.SelectGroup(t => t.Id)
.Select(Projections.Sum(conditionalProjection)))
.List<object[]>();

关于select - NHibernate QueryOver CASE WHEN 计算列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482739/

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