EF中的Lambda查詢、排序、高效分頁


 

數據庫中有張ClassInfo的表,如果打印ClassId為4的ClassName,方法如下。

方法1、使用普通方法。

 1 protected void Button1_Click(object sender, EventArgs e)
 2 {
 3     CodeFirstDbContext db = new CodeFirstDbContext();
 4     IQueryable<ClassInfo> classInfoList = from c in db.ClassInfo
 5                                           select c;
 6     foreach (ClassInfo classInfo in classInfoList)
 7     {
 8         Response.Write(classInfo.ClassName);
 9     }
10 }

 方法2、使用IQueryable的擴展方法where。

              擴展方法是:本來就沒有這個方法,后來經常能操作使用,額外地擴展了一個方法。下面是Where擴展方法的定義。

       public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

    其中this IQueryable<TSource> source 不是要求要傳入的參數,這表明這個擴展方法"Where"是給哪個類型擴展的。

    需要傳入的參數有:

    Where<TSource>:

            TSource:方法的數據源類型,如ClassInfo。

    Expression<Func<TSource, bool>

            參數是傳一個委托,可以寫一個符合這個委托的匿名函數或着Lambda表達式。這個委托類型的運算結果是bool類型(而不是傳一個bool類型),

            如果篩選條件為true就把篩選結果給了IQueryable,如果篩選結果為false,那么IQueryable結果中就為null。

 1 protected void Button1_Click(object sender, EventArgs e)
 2 {
 3     CodeFirstDbContext db = new CodeFirstDbContext();
 4     //使用where方法把ClassId=4的條件裝在IQueryable返回出去。Where<ClassInfo>說明后面的c的類型是ClassInfo。
 5     IQueryable<ClassInfo> ic = db.ClassInfo.Where<ClassInfo>(c => c.ClassId == 4);
 6     //還可以簡寫成這樣。
 7     //IQueryable<ClassInfo> ic = db.ClassInfo.Where(c => c.ClassId == 4);
 8     ClassInfo classInfo = ic.FirstOrDefault();
 9     Response.Write(classInfo.ClassName);
10 }

 方法1和方法2執行的效率都是一樣的,EF根據寫的Linq表達式或者Lambda生成相應的Sql語句。

普通升序、降序寫法。

 1 protected void Button1_Click(object sender, EventArgs e)
 2 {
 3     //普通升序寫法。
 4     CodeFirstDbContext db = new CodeFirstDbContext();
 5     var classInfoList = from c in db.ClassInfo
 6                         where c.ClassId > 0
 7                         orderby c.ClassId ascending
 8                         select c;
 9     foreach (ClassInfo cc in classInfoList)
10     {
11         Response.Write(cc.ClassId + "\r\n");
12     }
13 
14     //普通降序寫法。
15     CodeFirstDbContext db = new CodeFirstDbContext();
16     var classInfoList = from c in db.ClassInfo
17                         where c.ClassId > 0
18                         orderby c.ClassId descending
19                         select c;
20     foreach (ClassInfo cc in classInfoList)
21     {
22         Response.Write(cc.ClassId + "\r\n");
23     }
24 }

擴展方法升序、降序。

 1 protected void Button1_Click(object sender, EventArgs e)
 2 {
 3     //OrderBy:升序。
 4     CodeFirstDbContext db = new CodeFirstDbContext();
 5     //按照ClassInfo中的ClassId進行升序排序。
 6     //c=>true:說明表中的所有數據。
 7     //IQueryable<ClassInfo> classInfoList = db.ClassInfo.Where<ClassInfo>(c => true).OrderBy<ClassInfo, int>(C => C.ClassId);
 8     //也可寫成下面這樣,不在OrderBy后跟<ClassInfo, int>這個,根據C => C.ClassId 會自動推斷出來的。
 9     IQueryable<ClassInfo> classInfoList = db.ClassInfo.Where<ClassInfo>(c => true).OrderBy(C => C.ClassId);
10     
11     //OrderByDescending降序。
12     CodeFirstDbContext db = new CodeFirstDbContext();           
13     IQueryable<ClassInfo> classInfoList = db.ClassInfo.Where<ClassInfo>(c => true).OrderByDescending<ClassInfo, int>(C => C.ClassId);
14     foreach (ClassInfo classInfo in classInfoList)
15     {
16         Response.Write(classInfo.ClassId + "\r\n\r\n");
17     }    
18     
19     //也可以對字符串進行排序
20     CodeFirstDbContext db = new CodeFirstDbContext();
21     IQueryable<ClassInfo> classInfoList = db.ClassInfo.Where<ClassInfo>(c => true).OrderBy<ClassInfo, string>(C => C.ClassName);
22     foreach (ClassInfo classInfo in classInfoList)
23     {
24         Response.Write(classInfo.ClassName + "\r\n\r\n");
25     }
26 }

 分頁。用到了IQuerable的兩個方法Skip():跳過、Take()取。

 1 protected void Button1_Click(object sender, EventArgs e)
 2 {
 3     int pageIndex = 2; //第2頁
 4     int pageSize = 10; //每頁顯示10條數據。
 5 
 6     //第一種寫法。
 7     CodeFirstDbContext db = new CodeFirstDbContext();
 8     var classInfoList = (from c in db.ClassInfo
 9                         where c.ClassId>0
10                         orderby c.ClassId ascending
11                         select c).Skip<ClassInfo>((pageIndex - 1) * pageSize).Take<ClassInfo>(pageSize);
12     foreach (ClassInfo c in classInfoList)
13     {
14         Response.Write(c.ClassId);
15     }
16 
17     //第二種寫法。
18     CodeFirstDbContext db = new CodeFirstDbContext();
19     IQueryable<ClassInfo> classInfoList = db.ClassInfo.Where<ClassInfo>(c => true).OrderBy<ClassInfo, int>(C => C.ClassId).Skip<ClassInfo>((pageIndex - 1) * pageSize).Take(pageSize);
20     foreach (ClassInfo classInfo in classInfoList)
21     {
22         Response.Write(classInfo.ClassId + "\r\n\r\n");
23     }
24 } 

End。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM