【问题标题】:LINQ: unable to use group by and sortLINQ:无法使用分组和排序
【发布时间】:2019-10-17 10:20:51
【问题描述】:

我是 LINQ 新手,我需要编写一个查询来按日期获取分组记录。我的表有列:personId、monthAccepted、amountSent、processKeyId、dateProcessed 一个 personId 可以有多个条目。我的要求是通过 processKeyId 为每个不同的 personId 订单获取第一个条目(dateProcessed)。这是我尝试过的:

int pageNumber = 1; 
int pageSize = 100;

var RecordsInQueue = from o in db.PersonTransaction
.OrderByDescending(o => o.processKeyId)
.GroupBy(g => g.personId)
select o;

return RecordsInQueue.ToPagedList(pageNumber, pageSize));

运行上述查询时,出现以下错误:

“Skip”方法仅支持 LINQ to 中的排序输入 实体。必须在方法之前调用方法“OrderBy” “跳过”。

如何使用 LINQ 选择正确的记录?

【问题讨论】:

  • 你要返回什么类型的?

标签: c# linq


【解决方案1】:

我的猜测是你需要在你的RecordsInQueue 上做OrderBy

尽管您对 PersonTransaction 列表进行排序以生成 RecordsInQueue 列表,但实际上并未对该列表进行排序。

你可能只需要OrderByDescending(c => c.processKeyId)

代码是:

int pageNumber = 1; 
int pageSize = 100;

var RecordsInQueue = from o in db.PersonTransaction
.OrderByDescending(o => o.processKeyId)
.GroupBy(g => g.personId)
select o;

return RecordsInQueue.OrderByDescending(c => c.processKeyId).ToPagedList(pageNumber, pageSize));

这只是一个猜测,因为我不知道您的 ToPagedList() 方法在做什么。但它似乎很可能是在执行.Skip() 以跳转到相应的页面,如果不知道使用什么顺序跳过,它就无法可靠地执行此操作。

【讨论】:

    【解决方案2】:

    你可以试试

    var recordInQueue = db.PersonTransaction.OrderByDescending(x => x.processKeyId)
                                            .Skip((pageNumber - 1) * pageSize)
                                            .Take(pageSize)
                                            .GroupBy(g.PersonId)
                                            .Select(r => new {r.Key, r.Value}).ToList();
    

    【讨论】:

      【解决方案3】:

      您的查询是无序的,并返回无序的分组对象。您需要在致电RecordsInQueue.ToPagedList 之前订购它们。

      类似这样的:

      var query =
          from pt in db.PersonTransaction
          group prod by pt.personId into grouping
          select new
          {
              Id = grouping.Key,
              TotalOfSomething = grouping.Sum(p => p.Something)
          };
      
      // unordered query
      
      var ordered = query.OrderBy( pt => pt.TotalOfSomething );
      
      //now you can skip and take
      

      请注意,在您的查询中,结果将不包含 processKeyId,因为它不在 groupby 表达式中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-21
        • 2011-05-01
        • 2021-06-30
        • 2011-01-09
        • 2016-05-24
        • 2012-04-22
        • 2010-11-24
        • 1970-01-01
        相关资源
        最近更新 更多