延迟机制简述
对实体(DbSet)执行条件查询后,对应的SQL未必生成、执行,通常在执行了终结方法SQL才会真正地生成并执行
var books = dbContext.Books.Where(e => e.Price > 0);
题外话:EFCore的数据读取策略是片段式读取(避免内存占用过大,但数据量过大的情况下会导致长时间占用DB连接)。若需要将数据一次性加载至内存,可以通过执行ToList()、ToArray()等方法,但通常不会出现该情况
什么是终结方法?
简而言之,若返回值类型不为IQueryable<>的,通常是终结方法(遍历、ToList()、ToArray()、Max()、Min()、Count()等)。IQueryable<>只是"可执行的查询",实际上该查询并未生成对应的SQL,也未执行
如何进行动态SQL拼接
通过上述可知,IQueryable<>是"可执行的查询",但实际上并未生效,所以可以对其加码,执行终结方法时,翻译的SQL语句会囊括所有查询条件
var books = dbContext.Books.Where(e => e.Price > 0);
if (条件x)
{
books.Where(e => e.Title.Contains("ABC"));
}
else if (条件y)
{
books.Where(e => e.Title.Contains("DEF"));
}
else
{
books.Where(e => e.Title.Contains("GHI"));
}