EF實現分頁查詢+條件查詢+排序
先來看看幾個LINQ to SQL的幾個函式。
Take
說明:獲取集合的前n個元素;延遲。即只返回限定數量的結果集。
var q = (
from e in db.Employees
orderby e.HireDate
select e)
.Take(5);
語句描述:選擇所僱用的前5個僱員。
Skip
說明:跳過集合的前n個元素;延遲。即我們跳過給定的數目返回後面的結果集。
var q = (
from p in db.Products
orderby p.UnitPrice descending
select p)
.Skip (10);
語句描述:選擇10種最貴產品之外的所有產品。
OrderBy
適用場景:對查詢出的語句進行排序,比如按時間排序 等等。
說明:按指定表示式對集合排序;延遲,:按指定表示式對集合 排序;延遲,預設是升序,加上descending表示降序,對應的擴充套件方法是 OrderBy和OrderByDescending
下面這個例子使用 orderby 按僱用日期對僱員進行排序:
var q =
from e in db.Employees
orderby e.HireDate
select e;
說明:預設為升序
看完這兩個函式的使用方法,那麼分頁的思路也就很容易推出來了,若要顯示第m頁,每頁n條資料,我們應該跳過n*(m-1)條資料,顯示n條資料。
原始碼如下:
使用示例/// <summary> /// 分頁查詢 + 條件查詢 + 排序 /// </summary> /// <typeparam name="Tkey">泛型</typeparam> /// <param name="pageSize">每頁大小</param> /// <param name="pageIndex">當前頁碼</param> /// <param name="total">總數量</param> /// <param name="whereLambda">查詢條件</param> /// <param name="orderbyLambda">排序條件</param> /// <param name="isAsc">是否升序</param> /// <returns>IQueryable 泛型集合</returns> public IQueryable<T> LoadPageItems<Tkey>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Func<T, Tkey> orderbyLambda, bool isAsc) { total = MyBaseDbContext.Set<T>().Where(whereLambda).Count(); if (isAsc) { var temp = MyBaseDbContext.Set<T>().Where(whereLambda) .OrderBy<T, Tkey>(orderbyLambda) .Skip(pageSize * (pageIndex - 1)) .Take(pageSize); return temp.AsQueryable(); } else { var temp = MyBaseDbContext.Set<T>().Where(whereLambda) .OrderByDescending<T, Tkey>(orderbyLambda) .Skip(pageSize * (pageIndex - 1)) .Take(pageSize); return temp.AsQueryable(); } }
//查詢要求:每頁10條,顯示第2頁,查詢性別為“男”,按年齡增序排列
int totalRecord;
List<Student>result = studentService.LoadItems(10,2,out totalRecord,u=>u.Sex==”男”,u=>u.Age,True);
最近研究了點Linq to Sql的知識,發現還挺有意思的,歡迎大家和我一起交流。