无法从票证集合中选择最近的票证
本文关键字:选择 最近 集合 | 更新日期: 2023-09-27 18:34:55
我有一个高级票证对象列表,其结构如下:
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 级别。