【问题标题】:Querying last items using linq [duplicate]使用 linq 查询最后一项
【发布时间】:2018-03-23 18:56:41
【问题描述】:

所以我有一个列表,理想情况下使用实体框架从数据库中查询

var list = context.Items;

要填写的结果是这样的

var list = new List<Item>{
new Item { id=1, operation="write", date="23.03.2018 08:25:45" },
new Item { id=1, operation="read",  date="23.03.2018 09:40:15" },
new Item { id=1, operation="read",  date="23.03.2018 10:15:17" },
new Item { id=1, operation="read",  date="23.03.2018 11:46:39" }

所以我想按操作和最后日期缩小这个列表。

var min = new List<Item>{
new Item { id=1, operation="write", date="23.03.2018 08:25:45" },
new Item { id=1, operation="read",  date="23.03.2018 11:46:39" }

但我得到了最后一次写入操作和最后一次读取项

【问题讨论】:

  • 澄清:对于每个唯一 ID 和 Operation-Type,您想要最后一条记录吗?
  • 为什么是 标签?
  • @TimSchmelter 是的。对不起,我忘了在哈哈中添加id
  • @Denise:我希望Date 实际上不是一个字符串,而是一个DateTime

标签: c# linq


【解决方案1】:

对于每个唯一 ID 和 Operation-Type,您想要最后一条记录吗?

然后需要GroupByOrderByDescending 和匿名类型:

var query = context.Items
    .GroupBy(x => new { x.Id, x.Operation } )
    .Select(g => g.OrderByDescending(x => x.Date).First()); // presuming Date is a DateTime not string

如果Date 实际上是示例中的字符串,则应将其更改为DateTime。你真的不想总是解析它。在数据库中存储正确的类型。您将获得更高的安全性和性能。

【讨论】:

  • 看起来像手册.Max()...我建议类似于select new{SerialNumber=g.Key,uid =(from t2 in g select t2.uid).Max()};
  • @bradbury9:你为什么会这样建议? OP 不想要单个列的最大值,他想要每个 id 操作组合的最后一条记录(包括所有列的完整记录)。在question you have linked OP 中问了一些不同的东西(类似于这个),但实际上想要的是别的东西(max-value 而不是 max-row)。
  • 按 id 和 max(date) 操作分组将完成“缩小此列表”的要求。
  • @bradbury9: 但是你返回一个匿名类型而不是Item。如果有更多列,你想对每一列都使用这个子查询怎么办?我的结果是IEnumerable&lt;Item&gt;
  • 确实,根据使用情况,您的答案会更合适。
【解决方案2】:

下面的 LINQ 将按数据对项目进行排序,然后按操作对项目进行分组,并从每个组中选择第一项。

var result = list.OrderByDescending(d => d.date)
    .GroupBy(i => new { i.id, i.operation })
    .Select(g => g.FirstOrDefault())
    .ToList();

【讨论】:

  • 她想要最后一个 id-operation 不仅仅是为了操作(看她的评论)
  • 更新了id和操作
  • 现在这适用于 LINQ-To-Objects 但 OP 正在使用数据库。该查询不能保证正确的顺序,因为GroupBy 位于OrderbyDescending 之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多