
數據庫中有張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。
