Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq查询最后一项_C#_Linq - Fatal编程技术网

C# 使用linq查询最后一项

C# 使用linq查询最后一项,c#,linq,C#,Linq,所以我有一个列表,理想情况下可以使用实体框架从数据库中查询 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,

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

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和操作类型,您想要最后一条记录吗

然后需要GroupBy和OrderByDescending以及匿名类型:

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。你真的不想总是解析它。在数据库中存储正确的类型。您将获得更高的安全性和性能。

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

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

澄清:对于每个唯一的ID和操作类型,您想要最后一条记录?为什么要标记?@TimSchmelter yes。对不起,我忘了在中添加idhaha@Denise:我希望Date实际上不是一个字符串,而是一个DateTimeBooks像一本手册。Max。。。我建议类似于在g select t2.uid.Max}中选择new{SerialNumber=g.Key,uid=fromt2@布雷德伯里9:你为什么会这样建议?OP不想要单个列的最大值,他想要最后一个recordfull记录,包括每个id操作组合的所有列。在OP中,询问了一些与此类似的问题,但实际上需要的是elsemax值而不是max行。使用maxdate按id和操作分组将完成“缩小此列表”的要求。@bradbury9:但您返回的是匿名类型而不是项。如果有更多的列,您想对每一列使用这个子查询怎么办?我的结果是一个IEnumerable。事实上,根据使用情况,你的答案会更合适。她想要last for id操作,而不仅仅是操作查看她的注释更新了id和操作现在这在LINQ To对象中工作,OP使用的是数据库。在这里,此查询不能保证正确的顺序,因为GroupBy位于OrderbyDescending之后。