查询排序_EF中的Lambda查询、排序、高效分页

EF中的Lambda查询、排序、高效分页

c5eb0cc7010f2f475ba6a1a260247a11.png

数据库中有张ClassInfo的表,如果打印ClassId为4的ClassName,方法如下。

方法1、使用普通方法。

 1 protected void Button1_Click(object sender, EventArgs e) 2 { 3 CodeFirstDbContext db = new CodeFirstDbContext(); 4 IQueryable 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 Where(this IQueryable source, Expression> predicate);

其中this IQueryable source 不是要求要传入的参数,这表明这个扩展方法"Where"是给哪个类型扩展的。

需要传入的参数有:

Where:

TSource:方法的数据源类型,如ClassInfo。

Expression

参数是传一个委托,可以写一个符合这个委托的匿名函数或着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说明后面的c的类型是ClassInfo。 5 IQueryable ic = db.ClassInfo.Where(c => c.ClassId == 4); 6 //还可以简写成这样。 7 //IQueryable 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 + "");12 }13 14 //普通降序写法。15 CodeFirstDbContext db = new CodeFirstDbContext();16 var classInfoList = from c in db.ClassInfo17 where c.ClassId > 018 orderby c.ClassId descending19 select c;20 foreach (ClassInfo cc in classInfoList)21 {22 Response.Write(cc.ClassId + "");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 classInfoList = db.ClassInfo.Where(c => true).OrderBy(C => C.ClassId); 8 //也可写成下面这样,不在OrderBy后跟这个,根据C => C.ClassId 会自动推断出来的。 9 IQueryable classInfoList = db.ClassInfo.Where(c => true).OrderBy(C => C.ClassId);10 11 //OrderByDescending降序。12 CodeFirstDbContext db = new CodeFirstDbContext(); 13 IQueryable classInfoList = db.ClassInfo.Where(c => true).OrderByDescending(C => C.ClassId);14 foreach (ClassInfo classInfo in classInfoList)15 {16 Response.Write(classInfo.ClassId + "");17 } 18 19 //也可以对字符串进行排序20 CodeFirstDbContext db = new CodeFirstDbContext();21 IQueryable classInfoList = db.ClassInfo.Where(c => true).OrderBy(C => C.ClassName);22 foreach (ClassInfo classInfo in classInfoList)23 {24 Response.Write(classInfo.ClassName + "");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>010 orderby c.ClassId ascending11 select c).Skip((pageIndex - 1) * pageSize).Take(pageSize);12 foreach (ClassInfo c in classInfoList)13 {14 Response.Write(c.ClassId);15 }16 17 //第二种写法。18 CodeFirstDbContext db = new CodeFirstDbContext();19 IQueryable classInfoList = db.ClassInfo.Where(c => true).OrderBy(C => C.ClassId).Skip((pageIndex - 1) * pageSize).Take(pageSize);20 foreach (ClassInfo classInfo in classInfoList)21 {22 Response.Write(classInfo.ClassId + "");23 }24 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值