NHibernate LINQ отчита броя на групите в заявката

Пускам отчет на таблица и групирам по две колони. Искам да получа общия брой групи в резултата, за да мога да разлистя отчета. Въпреки това методът .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

Докато това, което искам, е нещо като select TOP(1) COUNT(*) OVER () FROM.

Има ли някакъв начин това да се случи с помощта на linq заявка?


person Bonnotbh    schedule 03.03.2017    source източник
comment
Просто, просто добавете към края: }).Select(x =› new { groups = x, count = x.Count());   -  person jdweng    schedule 03.03.2017


Отговори (1)


Това е известен проблем, NH-3154.

Вашият случай изисква броене от подзаявка. Доколкото знам, hql не го поддържа (подзаявките се поддържат само в select израз или where условия), така че вероятно няма да се поддържа скоро. (linq-to-nhibernate се превежда на hql.)

Така че трябва или да използвате собствена 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, можете да кажете на вашия потребител, че има още страници.

Разбира се, това ще издаде заявка, зареждаща всички ключове за групиране, след което ги преброява в паметта. Ако трябва да поддържате голям брой страници, това ще се представи зле.

person Frédéric    schedule 04.03.2017