不支持Take
和Skip
?
LINQ的美妙之處在於,您可以用q.Skip(50).Take(50)
來描述這個複雜的排序標準和剛纔所說的結果。如果每個頁面顯示50個結果,那麼這將帶您進入第二頁。當然,它轉換爲有效的T-SQL,它使用ROW_NUMBER
窗口函數指示數據庫使用您指定的順序查找結果。
你甚至可以有一個非常複雜的查詢與大量的過濾器。最終的結果仍然可以管理,因爲您要麼有行,要麼不行。所有你需要考慮的是結果可能是空的。
關於身份的說明,因爲拉迪斯拉夫指出,在完全相同的排序鍵(即日期和時間都爲空)的條目之間不保證順序。所以你要做的是添加一個身份列,這是你最不重要的排序列。沒有身份的日誌表/實體有時會被認爲設計不當,因爲當Date和Time可能爲空時,數據的增長是不可預測的。這會導致頁面拆分不良。經驗法則是表應該有一個狹窄而唯一的集羣主鍵。身份專欄非常適合這一點。它還將確保插入是快速操作,這是您的日誌表將會欣賞的事情。
隨着視圖的幫助下,你可以把訂單和ROW_NUMBER東西在普通T-SQL然後查詢,使用EF這樣的:
var q = from x in source
join y in source on x.RowNumber equals y.RowNumber - 1 into prev
join z in source on x.RowNumber equals z.RowNumber + 1 into next
from p in prev.DefaultIfEmpty()
from n in next.DefaultIfEmpty()
select new { Current = x, Previous = p, Next = n }
;
...或可能:
var q = from x in source
join y in source on x.RowNumber equals y.RowNumber - 1 into prev
join z in source on x.RowNumber equals z.RowNumber + 1 into next
select new {
Current = x,
Previous = prev.DefaultIfEmpty(),
Next = next.DefaultIfEmpty()
}
;
如果數據和時間都爲空,則不能保證上一個和下一個值實際上是當前記錄的上一個和下一個日誌記錄。 – 2011-03-21 18:44:37
爲了保證一個穩定的訂單,如果兩行中的日期和時間相等(包括它們都爲空),我將回退到行ID。我已經更新了這個問題,謝謝。 – 2011-03-21 19:15:01
所以不會像這樣的工作? '.OrderBy(x => x.Id).FirstOrDefault(x => x.Id> currentSequenceId)'這就是說給我當前記錄的'ID',我會在數據庫中搜索更大的第一條記錄比你給我的身份證。 – 2012-09-28 04:00:38