EF Core使用表达式树构建动态查询生成异常CASE WHEN格式SQL问题
问题原因
你构建表达式树时错误使用了按位运算方法,而非逻辑运算方法:
Expression.Or对应C#中的|按位或运算符,不是你需要的||逻辑或Expression.And对应C#中的&按位与运算符,不是你需要的&&逻辑与
EF Core 3.x无法将针对布尔值的按位运算直接转换为原生SQL逻辑运算符,只能先将每个布尔判断结果转换为1/0的bit类型,执行按位运算后再判断最终结果是否等于1,由此产生了你看到的大量CASE WHEN和CAST语句。
修复方案
替换代码中两处表达式聚合方法即可:
- 拼接同字段OR条件的
orList.Aggregate(Expression.Or)修改为orList.Aggregate(Expression.OrElse) - 拼接跨字段AND条件的
andList.Aggregate(Expression.And)修改为andList.Aggregate(Expression.AndAlso)
修改后EF Core可以正确识别逻辑运算,生成你预期的简洁WHERE子句格式。
优化建议
针对同字段多个值匹配的场景,你也可以直接构建Contains方法调用的表达式,最终会生成IN语法的SQL,执行效率比多个OR条件更高,也更易读。
内容的提问来源于stack exchange,提问作者Apolonius
相关产品推荐
相关产品推荐

