2

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

AdvancedTicket
-Id
-BasicTicket
-CreatedDate

BasicTicket
-Id

当我查询我的高级票证表时,我得到了这个:

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

...

我希望能够说“给我所有的 AdvancedTickets,但只显示每张 AdvancedTickets 的最新一张”。

我有这段代码不起作用:

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 中使用过这个函数,我将不胜感激。

4

1 回答 1

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

于 2013-10-12T00:20:00.877 回答