2012-06-08 154 views
8

我正在研究ASP.NET應用程序,我正在創建一個LINQ查詢,它將從數據庫中選擇分頁記錄。在用戶界面我有一個列表框,用戶可以選擇多個選項。我想知道:Linq to Entities Skip()和Take()

  • 如何增加Skip(),Take()參數來查看下一個結果?

  • 如何使用「IN」關鍵詞,以便如果用戶從列表框中選擇多個選項,查詢可以檢查所有值?

我的查詢看起來是這樣的:

var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Take(10).Skip(2);  
GridView1.DataSource = searchResults; 
GridView1.DataBind(); 
+0

您需要首先調用跳過再取。在你目前的實施中,你會一直檢索項目3到10,因爲你拿到了前10項,而那些你跳過前兩項。爲了遞增,只需要將跳轉的值作爲參數提供給執行查詢的方法。 – Franky

回答

7

您需要先打開頁面上的GridView控件。然後在PageIndexChanging事件:

var result = db.Where(...) 
       .Skip(e.NewPageIndex * grid.PageSize) 
       .Take(grid.PageSize) 
       .ToList(); // this is very important part too 

爲了模擬IN行爲:

var selection = list.SelectedItems.Select(i => i.Text).ToArray(); 
var result = db.Where(x => selection.Contains(x.Prop)); 
+1

在第二個查詢中添加關閉括號。 'db.Where(x => selection.Contains(x.Prop));' –

+0

@NhhilAgrawal:謝謝。 – abatishchev

+2

downvoter是否在意評論? – abatishchev

19

我認爲你正在使用跳過不正確。它應該在Take之前。

跳過一些記錄,所以對於你的第一頁,傳遞0,否則傳遞每頁(頁碼-1)*記錄。

我平時做這樣的事情:

int Page = 1; 
int RecordsPerPage = 10; 
var q = yourQuery.Skip((Page - 1) * RecordsPerPage).Take(RecordsPerPage); 
1

試試這個:

int temp = (CurrentPageNumber - 1) * 10; 
    var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Skip(temp).Take(10);