2013-10-11 43 views
2

我有先进的售票对象列表的集合,它具有这样的结构中选择最近的票:无法从门票

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

什么数据类型是item.BasicTicket.Id?这种类型需要有一个比较器。 – jcwrequests

+0

这是一个整数 – segFault

回答

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

+0

完全工作!这有助于我很多,这是有道理的,为什么它有困难之前:) – segFault

+0

当我通过调用内联来获取所有的AdsvacnedTickets我得到一个错误,说列'AdvancedTickets.Id'在选择列表无效,因为它不包含在任何一个聚合函数或GROUP BY子句..如果我说_session.GetAllAdvacnedTickets.ToList()它工作得很好。 – segFault

+0

@segFault GetAllAdvancedTickets是做什么的?该错误通常与某个SQL查询有关,该查询按一列进行分组,并且不分组或聚合正在选择的其他列。看看这两个问题,并阅读他们的答案和评论的更多细节:[这篇文章](http://stackoverflow.com/questions/16814343/),和[另一个](http://stackoverflow.com/questions/13999817 /)。 –