EFCore_查询延迟执行机制及基于此的动态SQL拼接

延迟机制简述

对实体(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"));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值