架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14713|回复: 2

[资料] EF 中 Expression<Func<T, bool>>与 Func<T, bool> 的区别

[复制链接]
发表于 2021-9-26 09:21:21 | 显示全部楼层 |阅读模式
Func<TObject, bool>是委托(delegate)

Expression<Func<TObject, bool>>是表达式

Expression编译后就会变成delegate,才能运行。比如

Expression<Func<int, bool>> ex = x=>x < 100;

Func<int, bool> func = ex.Compile();

然后你就可以调用func:

func(5) //-返回 true

func(200) //- 返回 false

而表达式是不能直接调用的。

案例:不正确的查询代码造成的数据库全表查询

错误代码如下:

将 Func 类型的变量作为参数传给Count 方法吗,EF 会将整个表的所有数据查询出来,从内存里面做筛选。生成的 sql 语句如下:

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT [c].[id], [c].[client_type], [c].[status], [c].[tenant]
      FROM [table] AS [c]
正确的代码如下:

正确的写法会从数据库中加 where 条件,然后,直接返回 count 的值。生成的 sql 语句如下:

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT COUNT(*)
      FROM [table] AS [c]
      WHERE [c].[client_type] = 1
QQ截图20210926091144.jpg

EF Core 系列(四)查看生成的 SQL 语句
https://www.itsvse.com/thread-9564-1-1.html

使用 Func 委托调用的是 System.Linq.Enumerable 下面的 Count

使用  Expression<Func<T, bool>> 表达式调用的是 System.Linq.Queryable 下面的 Count

QQ截图20210926090821.jpg

(完)





上一篇:【实战】制作 Java JDK Windows 绿色免安装版本
下一篇:【实战】Java 通过阿里云短信 SDK 发送短信验证码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-26 16:19:52 | 显示全部楼层
学习了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-26 17:31:25 | 显示全部楼层
不错,又来学习了。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 09:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表