Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
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
而表达式是不能直接调用的。
===========================
案例:不正确的查询代码造成的数据库全表查询。
1 2 3 4 5 6 7 8 9 10 11 12 | //错误的代码 Func<QuestionFeed, bool > predicate = null ; if (type == 1) { predicate = f => f.FeedID == id && f.IsActive == true ; } else { predicate = f => f.FeedID == id; } //_questionFeedRepository.Entities的类型为IQueryable<QuestionFeed> _questionFeedRepository.Entities.Where(predicate); |
上面代码逻辑是根据条件动态生成LINQ查询条件,将Func类型的变量作为参数传给Where方法。
实际上Where要求的参数类型是:Expression<Func<TSource, bool>>。
解决方法:
不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。
1 2 3 4 5 6 7 8 9 10 11 | //正确的代码 Expression<Func<QuestionFeed, bool >> predicate= null ; if (type == 1) { predicate = f => f.FeedID == id && f.IsActive == true ; } else { predicate = f => f.FeedID == id; } _questionFeedRepository.Entities.Where(predicate); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?