最近用MVC做的一個項目涉及到分頁,中間用了entity framework來查數據庫,不用直接寫sql語句,方便了很多。
一般分頁的思路是獲得兩個變量的值:
1.一共有多少條記錄 totalCount;
2.每頁有多少個數據 pageSize;
其中totalCount可以查數據庫得到,而pageSize一般由程序提前設定好,寫在配置文件中,或直接hardcode寫死。
有了這兩個變量,我們就可以知道一共有多少頁數據totalPage,有了這些值,就可以在頁面中將分頁的頁數顯示出來。
下面來看對指定的某一頁對應的數據庫操作:
要知道某一頁要呈現的數據,需要有如下兩個變量:
1.當前是第幾頁 currentPage
2.每頁有多少個數據 pageSize (第一頁和最后一頁數據條數可能不足)
其中currentPage可以由頁面的url傳進來,有了這些值,可以來寫數據庫查詢語句了。
用Entity Framework來寫數據庫查詢很簡單,需要用到skip和take這兩個函數,如下:
1 public List<Info> ListItem(Query query, int currentPage, int pageSize, out int totalPage) 2 { 3 IEnumerable<Info> items=base.Query.Where(t => t.ID == query.Ids.FirstOrDefault() && (!t.ServerStatus.HasValue||t.ServerStatus.Value != Deleted)); 4 int total = items.Count(); 5 double pageCount = Math.Ceiling((double)total /(double)pageSize); 6 totalPage =(int)pageCount ; 7 if (currentPage >= totalPage) 8 { 9 currentPage = totalPage; 10 } 11 return items.OrderBy(t => t.ID).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(); 12 }
skip()函數會跳過指定的記錄數,Take()函數會將余下的數據的前n條記錄拿出來,這樣就得到了指定頁currentPage的數據。不必擔心第一頁和最后一頁不足pageSize程序會出錯,
take函數已經屏蔽了這種錯誤,比如take(100),這時如果沒有100條記錄程序也不會異常,有多少條數據就會得到多少條數據。
最后只需要寫一個分頁的partial生成對應頁面的url在需要分頁的view里面調用就好,很是方便。
頁面的效果:

這面我沒有花太多心思在分頁工具的美觀上,感興趣的可以將其做得漂亮一些。
總結:entity framework作為微軟大力推的一個利器,確實有其很方便的地方,將程序員從手寫sql中解放出來,同時期代碼的簡潔性,也會漸漸取代ling to sql,但由於它最終還是會
生成對應的sql語句去查詢數據庫,雖然節省了寫查詢語句的事件,但其生成的sql語句肯定不會比直接手寫sql來得簡潔,尤其是多表連接,寫很復雜的查詢語句時,其生成sql語句的時間
和查詢性能不是很好的,這在大數據集下有時是致命傷。
有興趣的朋友可以用sql profile來看看entity生成的sql語句,會有更深的理解。
