思緒良久,最后還是決定記錄一下遇到的坑,畢竟被 ‘折磨’ 了三天,關于分頁,這個話題,我一開始時拒絕的,因為真正接觸項目的時候,才發現每個框架都會封裝一套自己的分頁,畢竟相同風格的項目是不常見的,而在學校書本上講的那套 web form分頁的那套說辭也out 了,學校接觸的MVC 不多,現在項目趕上,就來談談分頁的坑。一般如果自己寫底層分頁的話,無非就是,幾個輔助類,然后一個Pager的擴展類,再自己封裝下樣式,如果不熟悉的話,比如說我,還是用網上開源的吧
EF 誤區
1. 一直以來,自己的無知,以為用EF的Code first思想 來自動生成數據庫,數據表,實在是太繁瑣,自己也就寫過一兩個測試表玩玩,要是真正開發的時候,如果不是深入了解過EF的話,實在是費勁。然而,EF是分情況的,至少我是這么認為,有表或者無表。當數據庫已經存在的時候,仍然可以使用EF
2. 當存在數據表的時候,以往只知道創建數據庫實體類,然后生成一大堆東西(t4模板),如果不這樣話,自己手寫規則,這樣一來,不了解規則的話寫起來同樣比較費勁,然而,可以使用CodeFirst來直接生成實體類,
這樣下來,對比左邊和右邊就顯得簡潔多了,看起來也清爽
(注:如果不是最新的實體框架,輸入命令 Install-Package EntityFramework)
3. 總以為凡是用了實體類就 等于一下子把數據全部查詢出來,對于千萬級的數據,用EF來做翻頁,效率低的很。殊不知,EF實體是映射到數據庫中,并沒有做全部查詢,創建實體對象之后,Lambda是做延遲加載的,當使用Tolist() 方法之后,才算是在查詢數據庫
拋去以上錯誤觀點之后,當調用開源的分頁插件的Topagelist(pageindex,pagesize)方法時,實際上的效率并不比 sql(存儲過程) 訪問數據慢多少,另外Linq的 Skip() 和Take() 方法同樣也可以起到分頁的效果。 對于ADO.NET 訪問數據來說,一般思路是:
public ActionResult SqlList(int ? id =1) { int pageindex = id??1; int pagesize = 5; SqlConnection con = new SqlConnection(connectionString); SqlDataAdapter sda = new SqlDataAdapter(@"select * from (select *,ROW_NUMBER() OVER(ORDER BY BookID) number from Books) as b where b.number between " + (pageindex - 1) * pagesize + 1 + " and " + pageindex * pagesize + " ", con); DataSet ds = new DataSet(); sda.Fill(ds); List<Book> book = DataSetToList<Book>(ds.Tables[0]).ToList(); PagedList<Models.Book> bookpager = book.AsEnumerable().ToPagedList(pageindex,pagesize); return View(bookpager); }
以上代碼可以看出,先得到每頁的查詢結果,然后 反射成List<T> 對象,此處省略反射的公有方法1000行。。。
如果使用的是EF的話,那么代碼如下,可見是如此的簡潔明了
public ActionResult Index(int id = 1) { DBmodel db = new DBmodel(); return View(db.Books.AsEnumerable().OrderBy(a=>a.BookId).ToPagedList(id,5)); }
對于分頁前臺的實現
EasyUI
Bootstrap
Jquery、Ajax
自己封裝一套也可以,畢竟翻頁的風格是跟著項目界面的風格走的,比如說我當前的項目,就是純手寫前臺JS,關于翻頁,終究也就是這么回事,主要就是有時候沒有明白一個知識點,或者存在誤解的時候,真真是只有自己心里明白,問別人,提問,總感覺無法清楚的表述自己的問題,導致一時會卡很久,有些東西時間、經歷沒到,真是無法理解,好多點也都是畢業后,才潛移默化的理解了不少以前硬背也沒死記住的知識。同樣,這這里,要感謝那些積極回答我博問的園友。
---時間煮雨,雨落前堂
文章列表