EF Core:传入Func与直接写Lambda的Where查询为何存在实例创建差异?
EF Core两种Where写法的差异解析
核心差异在于传入Where方法的参数类型不同,导致EF Core的执行逻辑完全不一样:
使用
Func<Student, bool>委托的写法Func<Student, bool> whereClause = s => s.School!=null; var studentNames = efContext.Students.Where(whereClause).Select(s=>s.Name).ToList();Func<T, bool>是.NET的委托类型,属于LINQ to Objects范畴。EF Core无法解析委托的内部逻辑来生成对应SQL,只能先把Students表的所有数据完整加载到内存中(这一步必须实例化所有Student对象),之后再在内存里执行委托过滤,最后提取Name字段。直接使用Lambda表达式的写法
var studentNames = efContext.Students.Where(s => s.School!=null).Select(s=>s.Name).ToList();这里的Lambda表达式会被EF Core自动推断为**
Expression<Func<Student, bool>>表达式树**。表达式树是可被解析的抽象语法树,EF Core能读懂它的逻辑并翻译成对应的SQL条件(比如根据外键生成WHERE SchoolId IS NOT NULL),再结合后续的Select,最终生成的SQL只会查询Name字段。整个过程不需要加载完整的Student实体到内存,也就不会实例化Student类。
简单来说,前者是“先拉全量数据到内存再过滤”,后者是“先在数据库端过滤+查询需要的字段”,这就是二者行为差异的根源。
内容的提问来源于stack exchange,提问作者Dilshod
相关产品推荐
相关产品推荐

