我有一个高级票证对象列表,其结构如下:
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/