c# - 无法从票证集合中选择最新的票证

标签 c# linq

我有一个高级票证对象列表,其结构如下:

AdvancedTicket
-Id
-BasicTicket
-CreatedDate

BasicTicket
-Id

当我查询我的高级票务表时,我得到以下信息:

1, BasicTicketId1, 10/11/12
2, BasicTicketId2, 10/11/12
3, BasicTicketId1, 10/12/13

...

我希望能够说“给我所有高级门票,但只向我显示每张高级门票的最新门票”。

我的代码不起作用:

from item in allAdvancedTickets
group item by item.BasicTicket.Id
into basicTicket
let d = basicTicket.OrderByDescending(c => c.CreatedDate)
orderby d descending
select basicTicket;

我遇到了一个错误,提示至少有一项需要实现 iComparable。

我认为这个查询一开始就是错误的,但我以前从未在 linq 中使用过这个函数,我希望得到一些帮助。

最佳答案

您应该首先按CreatedDate 对项目进行排序,将它们分组,然后选择每组中的第一个项目。该项目将是最新的一项,因为您之前已经对它们进行了排序。

该序列将产生以下查询:

var query = from item in allAdvancedTickets
            orderby item.CreatedDate descending
            group item by item.BasicTicket.Id
            into basicTickets
            select basicTickets.First();

根据评论,如果您使用 NHibernate,则在分组时会出现错误。您可以通过以下方式使用两个查询来解决此问题:

var idDateQuery = from item in _session.GetAllAdvacnedTickets()
                  orderby item.BasicTicket.Id, item.CreatedDate descending
                  select item;

var query = from item in _session.GetAllAdvacnedTickets()
            let top = idDateQuery.First(o => o.BasicTicket.Id == item.BasicTicket.Id)
            where item.Id == top.Id
            select item;

请注意,我尚未针对 NHibernate 对此进行测试。如果无法解决此问题,您可能需要降级到 SQL 级别。

关于c# - 无法从票证集合中选择最新的票证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328952/

相关文章:

c# - 如何使用 Distinct 从 Linq 查询中选择特定对象?

c# - 读取响应流时出现 OutOfMemoryException

c# - 如何将数组内容与其索引值连接起来

c# - 如何根据多个条件使用 Linq 查找特定项目?

c# - 传递到字典中的模型项是 .. 类型的,但是这个字典需要一个类型的模型项

c# - 字符串连接 Visual Studio 2019 上的 int.ToString() 错误

c# - 系统配置 web.config 和 app.config

c# - 如果联接中有多个字段,您如何在 Linq 中离开联接?

c# - Linq - 高级 .OrderBy

c# - 使用 lambda 表达式计算两个带有索引的列表的交集