IQueryable与IEnumerable的区别
1、从IQueryable的定义可以看出,它继承自IEnumerable;
2、IQueryable是在数据库服务器端进行数据筛选的(服务器端评估),而IEnumerable是把数据加载到应用程序内存中,再进行筛选的(客户端评估);
在下面的例子中,在第一张图红色框中可以看到当我们使用IQueryable的时候,EF生成的SQL语句把Where筛选条件带上了;而第二张图中,当我们使用IEnumerable时,EF生成的SQL语句是没有Where筛选条件的;
3、IQueryable是延迟执行的,从下图可以看出在执行遍历之前,对变量test的操作并没有实际执行数据库查询;
当一个方法的返回值仍然是IQueryable类型,这个方法一般就是非立即执行的方法,否则这个方法就是立即执行方法;从下图可以看到Count方法的返回类型为int类型,此时立即执行了SQL查询,而当我们使用OrderByDescending方法时,返回类型为IQueryable,此时没有立即执行SQL查询。
利用IQueryable的延迟执行的特性,我们可以拼接出复杂的查询条件后再去执行查询。比如拼接好查询条件后,我们可以复用IQueryable来获取数据总数,然后在获取第一条数据;