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