【发布时间】:2015-04-10 15:55:22
【问题描述】:
我在 QueryOver 中使用 Group by 并在 where 子句中有一些标准时遇到问题。想要在 Have 子句中使用 SUM() 值移动一些条件,但每次它出现在 Where 子句中并导致错误。 **Error** ="*An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference*"
Conjunction conjunction = Restrictions.Conjunction();
Conjunction havingconjun = Restrictions.Conjunction();
conjunction.Add<Vendor>(p => v.Name == "Some Vendor");
havingconjun.Add(Restrictions.Gt(
Projections.Sum(Projections.Property(() => v.Payments),
Convert.ToDouble(SomeInvoice.Value)));
var reportModels =
Session.QueryOver<Vendor>(() => v)
.Where(conjunction)
.Where(havingconjun)
.SelectList(list => list
.SelectGroup(() => v.Number).WithAlias(() => vModel.VendorNumber)
.SelectGroup(() => vtypeCode.Code).WithAlias(() => vModel.VendorType)
.SelectGroup(() => v.Name).WithAlias(() => vModel.VendorName))
.TransformUsing(Transformers.AliasToBean<VendorAnalysisReportModel>())
.List<VendorAnalysisReportModel>();
预期结果:
SELECT
V.VENDORNUMBER, V.VENDORTYPE, V.VENDORNAME, SUM(V.PAYMENTS)
FROM VENDOR V
WHERE V.NAME = "Some Vendor"
GROUP
BY V.VENDORNUMBER, V.VENDORTYPE, V.VENDORNAME
HAVING SUM(V.PAYMENTS) > somevalue
立即行动:
SELECT
V.VENDORNUMBER, V.VENDORTYPE, V.VENDORNAME, SUM(V.PAYMENTS)
FROM VENDOR V
WHERE V.NAME = "Some Vendor" AND
SUM(V.PAYMENTS) > somevalue
GROUP
BY V.VENDORNUMBER, V.VENDORTYPE, V.VENDORNAME
【问题讨论】:
-
请不要出现缺少括号或类似错误。实际查询非常庞大,无法放在这里,因此它是原始问题查询的微小副本。
-
抱歉忘记了查询中的一行 .Select(Projections.Sum(Projections.Property(() => v.Payments))).WithAlias(() => vModel.Payments) 但我的注意力是关于 Where 和 Have 子句。谢谢
-
我知道已经有一段时间了,但我遇到了这篇文章,因为我有同样的问题。你能解决吗?
-
这似乎是一个目前没有解决方案的问题。我用谷歌搜索并尝试了不同的方法,但都没有奏效。
-
不,但我找到了我公司的其他开发人员也在使用的解决方案,我应该把这个作为答案吗?好的 离开它。我删除了havingconjun表单查询。从 reportmodal 获取答案,然后使用 LINQ 应用我的 where 子句,因为我得到了所有 SUM 字段。
标签: aggregate-functions queryover