先看图
IQueryable
在使用EF框架时候,我们都会使用Linq表达来创建sql语句式进行数据查询
使用Linq表达式创建的变量 就是IQueryable变量
在完成IQueryable的创建以后,我们的表达式不会立即执行,所以Linq返回的IQueryable类型并不是查询结果,而是延迟执行的表达式,最后直到我们使用聚合函数操作之后,才会真正执行数据库的操作。
延迟执行的目的:
1.为后续动态表达提供可能,比如下面代码:
public IEnumerable<TouristRoute> GetTouristRoutes(string keyword)
{
//Include 和Jion 都可以进行表连接 IQueryable将会对数据进行延时处理 只会先生成sql语句 并不会执行操作
IQueryable<TouristRoute> result = _context.TouristRoutes.Include(t => t.TouristRoutePictures);
//判断搜索内容是否为空
if (!string.IsNullOrEmpty(keyword))
{
//对字符串进行空字符去除
keyword = keyword.Trim();
result = result.Where(t=>t.Title.Contains(keyword));
}
return result.ToList();//ToList将会立即执行数据库操作
}
这个函数表示,关键词搜索,通过keyword进行,有2种情况需要考虑,一种是有关键词的情况,一种是没有,有了IQueryable 我们就可以用一个简单的if语句进行判断,根据不同的情况,加入Where语句。
2.**减少数据库的执行次数。**我们知道,每次执行数据库的操作,其实就是一次IO操作,而系统中的IO操作开销是最大的也是最浪费时间的,而IQueryable设计之初,就是为数据库服务的,
IQueryable在创建的时候是以Experssion Tree也就是表达式 目录树的形式构成的,本质上是棵二叉树,所以我们可以不断的给这棵树添加分支,也就是添加新的表达式,直到最后一步,一次性把所有的sql表达式转换成sql语言,统一进行数据库的一次操作,所以linq语句是执行延迟操作的基础,也是最好的EF工具。