无法从故障单集合中选择最近的故障单

时间:2013-10-11 23:56:16

标签: 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中使用过这个函数,我很感激一些帮助。

1 个答案:

答案 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级别。