数据库中有张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。