2012-09-30 54 views
2

假設我們有一個SQL Server表(按名稱排序)如下數據:通過Id和Name獲取下一個和上一個sql行,EF?

Id Name  LName 
------------------------- 
5 Abbas  Dayyan 
3 Mohammad  KD 
4 Nima   Ahmad 
1 Omid   Zangene 
2 Pedram  Ahmadi 

我們有一個ID查詢字符串,我們想從標識獲取下一個和前一行(如果存在)。

e.g:

的Id查詢字符串是4,所以我們想要得到穆罕默德KD作爲前一行和奧米德Zangene作爲下一行。

請你指導我如何使用LINQ to Entity Framework做到這一點。

編輯:
實際上表中的行數爲100萬左右。
默認情況下,表格行不按名稱排序,wa需要按名稱對結果進行排序。

+1

此列表是否按名稱排序總是? – Dharun

+0

@Dharun:不,我們想按名稱對結果進行排序 –

回答

5

這個怎麼樣?

var result = (from person in db.People 
       where person.Id == id 
       let ordered = db.People.OrderBy(p => p.Name)     
       let reversed = db.People.OrderByDescending(p => p.Name)     
       let previous = reversed.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault() 
       let next = ordered.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault() 
       select new { previous, next }).First(); 

編輯:接過新規範考慮在內。

編輯2:將代碼修改爲不使用LastOrDefault,它不適用於LINQ to Entities。

+1

這似乎不適用於我。我得到錯誤'LINQ to Entities不能識別方法LastOrDefault方法,並且這種方法不能被轉換成存儲表達式。' – magnattic

+0

@atticae:我修改瞭解決方案。修改後的代碼是否有效? –

+0

還沒有測試過你的具體解決方案,但是這與我結束了。 – magnattic

1

試試這個:

int id = 4;  
var list = (from x in ctx.Table 
      where x.id >= id - 1 && x.id <= id + 1 
      select x).OrderBy(o -> o.name).ToList(); 

編輯:這將返回ID爲3,4和5。我不知道你實際上是在訂購表中按名稱數據庫元素,但如果你是我想使用循環而不是使用linq來獲取上一個和下一個元素會更容易。

更新:按名稱排序結果

+0

*我認爲使用循環而不是使用linq來獲取上一個和下一個元素會更容易* - 如果表有數百萬或數十億條記錄,則不是。 –

+0

這是不正確的,因爲它需要ID爲asc/desc。 – juFo

相關問題