2009-07-09 11 views
13

Hầu hết các giải pháp phân trang ASP.NET MVC mà tôi đã tìm thấy bằng cách googling trông giống như họ nhận tất cả các hàng từ một bảng cơ sở dữ liệu dưới dạng bộ sưu tập IEnumerable, thực hiện một số chuyển đổi phân trang trên bộ sưu tập IEnumerable, và sau đó trả về kết quả lượt xem. Tôi muốn có thể trang trên phía DB nhưng vẫn có một số lớp phân trang để làm các phép tính số trang và tạo HTML. Có một giải pháp ra khỏi đó mà thực hiện điều này? Hoặc là những người tôi đã được nhìn vào làm điều này, nhưng tôi không nhìn thấy nó bởi vì tôi đang nhìn họ sai?Có một giải pháp phân trang cho ASP.NET MVC mà phân trang trong cơ sở dữ liệu?

đây là những gì tôi đã được tìm kiếm tại địa chỉ:

+0

Điều này thực sự không có gì để làm với ASP.NET MVC ... –

+0

bạn là chính xác, nhưng tôi didn không biết điều này cho đến sau câu trả lời của jvanderh và Craig. xin lỗi về bất kỳ sự nhầm lẫn nào. – gabe

Trả lời

14

Nhìn vào mẫu Nerdinner của Gu.

var upcomingDinners = dinnerRepository.FindUpcomingDinners(); 
var paginatedDinners = upcomingDinners.Skip(10).Take(20).ToList(); 

Mặc dù FindUpcomingDinners() được tất cả các bữa ăn tối sắp tới, truy vấn không thực hiện tại cơ sở dữ liệu cho đến khi bạn gọi ToList() trong dòng tiếp theo. Và đó là sau khi bạn Bỏ qua 10 hàng và chỉ nhận được
lần tiếp theo 20.

+0

tôi sẽ kiểm tra nó ra mẫu thử. ah, tôi hiểu rồi. câu cuối cùng của bạn làm tôi rất vui! thx nhiều! – gabe

+0

Tôi khuyên bạn nên kiểm tra toàn bộ mẫu, nhưng liên kết tôi đã cung cấp là chương giải thích chi tiết hơn về cách hoạt động của IQueryable. – jvanderh

+0

Tôi đang làm điều đó như chúng tôi bình luận – gabe

5

Bạn đang sai. PagedList sẽ làm điều đó trên máy chủ DB, vì nó có phần mở rộng IQueryable.

+0

Vậy cú pháp hành động của bộ điều khiển sẽ là gì? tất cả mọi thứ tôi đã nhìn thấy làm một cái gì đó như productRepository.GetAllProducts(). ToPagedList (pageIndex, pageSize). – gabe

+1

Vâng, điều đó đúng. Điều này chuyển đổi ** trang đã chọn chỉ ** thành IEnumerable. Phân trang được thực hiện trên máy chủ DB thông qua IQueryable. Ditto cho Count. –

+1

vấn đề của tôi là tôi không biết những gì IQueryable đã làm (tức là "hoãn thi hành"). ý kiến ​​của bạn cũng như những người khác đã chỉ cho tôi đúng hướng để hiểu. cám ơn! – gabe

3

ScottGu có một loạt blog rất đa dạng về sử dụng LINQ trong Asp.Net (bao gồm MVC). Tôi khuyên bạn nên đọc toàn bộ chuỗi bắt đầu từ Phần 1, nhưng Part 3 bao gồm chính xác những gì bạn đang tìm kiếm - phần có tiêu đề "Phân trang kết quả truy vấn của chúng tôi" đặc biệt đề cập đến phân trang trong cơ sở dữ liệu.

2

sẽ không hiệu quả hơn khi triển khai thủ tục được lưu trữ có tham số @StartPage và @PageSize?

cách này bạn chỉ lấy các tập hợp con của dữ liệu được thực sự được sử dụng

chỉ có một tham số ra gọi TOTALCOUNT hoặc một cái gì đó tương tự để bạn biết có bao nhiêu liên kết trang để tạo ra và mỗi sự kiện onclick liên kết sẽ vượt qua số trang để một hàm javascript mà không đồng bộ sẽ được tải div hoặc phần tử HTML khác với nhiều dữ liệu

dễ

+0

LINQ làm điều tương tự với Skip() và Take(). Nếu dữ liệu của bạn được truy cập bởi vô số các ứng dụng thì tôi cho rằng một thủ tục lưu sẵn là một ý tưởng tốt. Nếu không, LINQ sẽ dễ dàng hơn trong việc thực hiện, đọc và gỡ lỗi. – jrjensen