我有一个高级票证对象列表,其结构如下:
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中使用过这个函数,我很感激一些帮助。
答案 0 :(得分:2)
您应首先按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级别。