2012-06-08 12 views
8

Tôi đang làm việc trên một ứng dụng ASP.NET và tôi đang tạo một truy vấn LINQ sẽ chọn các bản ghi được phân trang từ db. trên giao diện người dùng, tôi có một hộp danh sách nơi người dùng có thể chọn nhiều lựa chọn. Tôi muốn biết:LINQ to Entities Skip() và Take()

  • Làm cách nào để tăng các tham số Skip(), Take() để xem kết quả tiếp theo?

  • Làm cách nào để sử dụng từ khóa "IN" để nếu người dùng chọn nhiều tùy chọn từ hộp danh sách, truy vấn có thể kiểm tra tất cả các giá trị?

truy vấn của tôi trông như thế này:

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

Bạn cần phải gọi đầu tiên bỏ qua và sau đó đi. Trong triển khai hiện tại của bạn, bạn sẽ luôn truy xuất các mục từ 3 đến 10, vì bạn lấy 10 mục đầu tiên và từ những người bạn bỏ qua hai mục đầu tiên. Để tăng bạn chỉ cần cung cấp giá trị để bỏ qua như một tham số cho phương thức của bạn nơi truy vấn được thực hiện. – Franky

Trả lời

7

Bạn cần phải bật phân trang trên GridView đầu tiên. Sau đó, trên PageIndexChanging sự kiện:

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

Để bắt chước hành vi IN:

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

Thêm dấu ngoặc đóng trong truy vấn thứ hai. 'db.Where (x => selection.Contains (x.Prop));' –

+0

@NikhilAgrawal: Cảm ơn. – abatishchev

+2

Người chăm sóc downvoter có nhận xét không? – abatishchev

19

Tôi nghĩ rằng bạn đang sử dụng Skip không chính xác. Nó phải được trước khi Take.

Bỏ qua bỏ qua một số bản ghi, do đó, đối với trang đầu tiên của bạn, hãy chuyển đến 0, khác chuyển vào (số trang - 1) * bản ghi trên mỗi trang.

Tôi thường làm điều gì đó như thế này:

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

Hãy thử điều này:

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);