Func<T, bool>与Expression<Func<T, bool>>的区别

Func<T, bool>是委托(delegate)

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

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

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

// 将表达式树描述的 lambda 表达式编译为可执行代码,并生成表示该 lambda 表达式的委托。

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

然后你就可以调用func:

func(5) //-返回 true

func(200) //- 返回 false

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

案例:

public class DB
{
static public ISession Session
{

get { return SessionManager.GetCurrentSession(); }
}

//错误的代码
static public IList<T> Query1<T>(Func<T, bool> where)
{
return Session.Query<T>().Where(where).ToList();
}

//正确的代码
static public IList<T> Query2<T>(Expression<Func<T, bool>> where)
{
return Session.Query<T>().Where(where).ToList();
}
}

//不正确的查询代码如直接<Func<T, bool>作为参数造成的数据库全表查询

IList<Person> DB.Query1<Person>(obj=>obj.age>12); //查询年龄大约12

//正确的做法是使用Expression作为参数

IList<Person> DB.Query2<Person>(obj=>obj.age>12); //查询年龄大约12

使用这两种参数的函数对调用者来说发现问题,不过还是可以通过输出的SQL语句看出问题,使用Func直接作为参数,SQL中没有where语句,直接进行了全库检索。

注:
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。这个是祖宗。
Func可以接受0个至16个传入参数,必须具有返回值。
Action可以接受0个至16个传入参数,无返回值。
Predicate只能接受一个传入参数,返回值为bool类型。

时间: 2024-11-07 16:30:16

Func<T, bool>与Expression<Func<T, bool>>的区别的相关文章

.NET Core中合并Expression&lt;Func&lt;T,bool&gt;&gt;的正确姿势

这是在昨天的 .NET Core 迁移中遇到的问题,之前在 .NET Framework 中是这样合并 Expression<Func<T,bool>> 的: public static class ExpressionBuilder { public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expr

拉姆达表达式 追加 条件判断 Expression&lt;Func&lt;T, bool&gt;&gt;

public static class PredicateBuilder { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效,多个OR无效:混应时写在AND后的OR有效 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expre

Expression&lt;Func&lt;T&gt;&gt;和Func&lt;T&gt;

以前用EF的时候,由于where的时候有Expression<Func<T>>和Func<T>两种查询条件,误用了Func<T>那个重载,后来还想通过func创建查询来着,不过失败了,导致了全表查询,真是无语.国内的人答的比较言简意赅(其实我觉得讲的不好).还是老外讲的明白点. 翻译过来吧,就是说Func<T>是方法的委托,而Expression<Func<T>>是拉姆达表达式树.这个树状结构描述了各种各样恶心的参数(如下

表达式拼接Expression&lt;Func&lt;IEntityMapper, bool&gt;&gt; predicate

/// <summary> /// 重写以筛选出当前上下文的实体映射信息 /// </summary> protected override IEnumerable<IEntityMapper> EntityMappersFilter(IEnumerable<IEntityMapper> entityMappers) { Type contextType = typeof(TDbContext); Expression<Func<IEntityM

多条件Expression&lt;Func&lt;T, bool&gt;&gt;

EF中需要传入多条件的Expression<Func<T, bool>>时可以这样用: (u) => (u.Receiver == name && u.isRead == true)

Expression&lt;Func&lt;TObject, bool&gt;&gt;与Func&lt;TObject, bool&gt;的区别

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) //-返回

lambda表达式Expression&lt;Func&lt;Person, bool&gt;&gt; 、Func&lt;Person, bool&gt;区别

前言: 自己通过lambda表达式的封装,将对应的表达式转成字符串的过程中,对lambda表达式有了新的认识 原因: 很多开发者对lambda表达式Expression<Func<Person, bool>> .Func<Person, bool>表示存在疑惑,现在就用代码举个简单列子 原代码: using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expres

Expression&lt;Func&lt;T,TResult&gt;&gt;和Func&lt;T,TResult&gt; 与AOP与WCF

1>>Expression<Func<T,TResult>>和Func<T,TResult>http://www.cnblogs.com/xcsn/p/4520081.htmlhttp://www.cxyclub.cn/n/63037/http://q.cnblogs.com/q/37952/2>>AOP与WCFhttp://www.oschina.net/question/2245602_178068?sort=timehttp://www.c

Expression&lt;Func&lt;T,TResult&gt;&gt;和Func&lt;T,TResult&gt;

1.Expression<Func<T,TResult>>是表达式 //使用LambdaExpression构建表达式树 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z; Console.WriteLine(expr.Compile()(1, 2, 3)); https://msdn.microsoft.com/zh-cn/library/system.linq.