重新排列LINQ中的子句

本文关键字:LINQ 子句 排列 新排列 | 更新日期: 2023-09-27 17:59:54

叹息。。。在我的墓碑上,它会写着"Died adding one more clause to a LINQ query"

所以我有以下内容:

var validStatuses = new[] { 
  "Assigned", "Donor Called", "Dispatched", "Waiting",
  "Title Rec'd", "Sending Title", "Cancelled", "Waiting"};
var ud = db.Updates
  .Where(c => !c.Sold && validStatuses.Contains(c.Status))
  .GroupBy(c => c.Vehicle)
  .Select(x => x
     .OrderByDescending(y => y.TimeStamp)
     .First())
  .ToList();

我已经意识到我需要在日期之后有Contains子句。换句话说,只有当最近的条目包含"validStatus"时,我才需要选择最近的条目。现在,只要每个条目都包含"validStatus",它就会返回多个条目。

我会非常感激你的帮助。。。非常感谢。

重新排列LINQ中的子句

正如您在问题中所建议的,只需将contains子句移到日期之后即可。

var ud = db.Updates
  .Where(c => !c.Sold)
  .GroupBy(c => c.Vehicle)
  .Select(x => x
     .OrderByDescending(y => y.TimeStamp)
     .First())
  .Where(c => validStatuses.Contains(c.Status));

此外,如果您计划在linq-to-entities查询中使用ud,那么不要在最后将查询转换为列表。

我的理解是这是可行的(但我错过了最新的评论…):

var ud = db.Updates
              .Where(c => !c.Sold)
              .GroupBy(c => c.Vehicle, x => x, (x,gr) => new { key = x,
                  list = gr.ToList().OrderByDescending(z => z.TimeStamp).First() })
               .Where(x=> validStatuses.Contains(x.list.Status))
              .Select(x => x.list).ToList();

它是按车辆分组的,并且只保留最新项目具有有效状态的组。。。