2013-10-11 44 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 /)。 –