NHibernate LINQ计数查询中的组数

时间:2017-03-03 16:02:14

标签: c# linq nhibernate hql

我正在运行一个表的报告,并按两列分组。我想获得结果中的组总数,以便我可以分页报告。但是.Count()方法返回第一组中的行数。查询是

return data.GroupBy(x => new { x.Item.Parent.Name, x.Date })
           .Select(x => new Item
           {
                Parent = x.Key.Name,
                Date = x.Key.Date,
                PredictedSales = x.Sum(y => y.PredictedSales),
                RealSales = x.Sum(y => y.ActualSales),
            });

.Count()正在执行以下查询

select cast(count(*) as INT) as col_0_0_
from   dbo.[table1] table1
   left outer join dbo.[Table2] table2
     on table1.Table2Id = table2.Id
        and 0 /* @p0 */ = table2.Deleted
   left outer join dbo.[Table3] table3
     on table2.Table3Id = table3.Id
where  table1.Date >= '2017-03-01T00:00:00' /* @p2 */
   and table1.Date <= '2017-03-15T00:00:00' /* @p3 */
   and (table1.VariancePercentage is not null)
   and abs(table1.VariancePercentage * 100 /* @p4 */) <= 5 /* @p5 */
group  by table3.Name,
      table1.Date

虽然我想要的是选择TOP(1)COUNT(*)OVER()FROM。

有没有办法使用linq查询来实现这一点?

1 个答案:

答案 0 :(得分:3)

这是一个已知问题,NH-3154

您的案例需要从子查询中计算。据我所知,不支持它(仅在select表达式或where条件中支持子查询),因此很可能不会很快支持它。 (转换为。)

所以你必须使用sql本地查询来计算(session.CreateSQLQuery("...")),或者可能在功能和性能方面有所妥协:

  • 选择可供浏览的最大页数。
  • 查询以下问题:
var maxResults = maxPageCount * pageSize + 1;
var count = data.GroupBy(x => new { x.Item.Parent.Name, x.Date })
    .Select(x => x.Key)
    .Take(maxResults)
    .ToList()
    .Count();
  • 如果count == maxResults,您可以告诉您的用户有更多页面。

当然,这将发出一个查询,加载所有分组键,然后在内存中计算它们。如果你必须支持大量的页面,这将表现不佳。