首页 > 代码库 > Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
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
而表达式是不能直接调用的。
===========================
案例:不正确的查询代码造成的数据库全表查询。
//错误的代码 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>>。
//正确的代码 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);
Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。