码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-11 14:16:55      阅读:871      评论:0      收藏:0      [点我收藏+]

标签:getc   案例   直接   数据库   func   值类型   cti   etc   .com   

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类型。

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

标签:getc   案例   直接   数据库   func   值类型   cti   etc   .com   

原文地址:http://www.cnblogs.com/SafeSimple/p/7818759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!