2010-05-10 120 views
3

這可能是一個關於LINQ的新手問題,但假設我有一組具有DateTime屬性的項目,一個日期至多有一個項目,我將如何去選擇N個最近的項目參考日期,即日期小於所請求日期的N個項目,以及最大日期?
我的天真想法是首先選擇日期小於參考日期的項目,按日期排序,然後從該子集中選擇N個第一項。選擇n最大使用LINQ

var recentItems = from item in dataContext.Items 
       where item.Date<=date 
       orderby item.Date descending 
       select item; 

var mostRecentItems = recentItems.Take(5).ToList(); 

這是做到這一點的「正確」方式,還是明顯有更好的方法來實現我的目標?

回答

5

是的,這是正確的方法。在那裏用dataContext這個詞來判斷,我假設這是Linq to SQL代碼;它會變成一個有效的TOP N查詢。

(好吧,「高效」,只要該數據是按日期索引)。

有一件事我可能會改變就是去掉ToList()。除非你真的需要它是一個列表,它是通常更好地把它作爲一個IEnumerable<T>,尤其是如果你只需要遍歷它,而不是通過索引獲取元素。

編輯:我應該限定我的意思是更好參考ToList。當您調用ToList時,最終會得到一個內存結構,該結構包含集合中元素的所有全部。這消耗了你並不總是需要使用的內存。創建列表還需要對所有記錄進行完整迭代,所以如果稍後迭代列表本身,則會遍歷每個元素兩次。

對於只有5個元素,差異可能不會引人注意;然而,對於5000個元素來說,這可能很重要。因此,除非您確定需要,否則您應該養成不使用ToList()的習慣。大多數時候,你沒有。

+0

DataContext來自EF。並感謝對日期索引和使用ToList()的有用評論。在這個特殊情況下,我確實需要一個列表,即使原因在問題描述中沒有提及! – Mathias 2010-05-11 00:36:26

2

我認爲這很好。你也可以用1句話做到這一點:

var recentItems = (from item in dataContext.Items 
       where item.Date<=date 
       orderby item.Date descending 
       select item).Take(5).ToList(); 

但你的方式同樣好。

3

是的,這正是如何做到這一點。