首页 新闻 会员 周边

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

1
悬赏园豆:100 [已解决问题] 解决于 2012-06-26 22:35

使用EntityFramework中where查询时,fiter可以是Expression<Func<TObject, bool>>,或者Func<TObject, bool>。网上查了很多资料,还是一知半解、一头雾水,求高手赐教!还有就是如何将多个Expression合并为一个呢?

DeeRoad的主页 DeeRoad | 初学一级 | 园豆:3
提问于:2012-06-26 09:58
< >
分享
最佳答案
8

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

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

参考:http://stackoverflow.com/questions/793571/why-would-you-use-expressionfunct-rather-than-funct

 

关于EF中用哪个你可以看看这篇文章:Entity Framework - Func引起的数据库全表查询

关于如何将多个expression合并为一个可以写多个where:

.where(expression1).where(expression2)...

运行时EF会自动合并优化的

收获园豆:100
artwl | 专家六级 |园豆:16736 | 2012-06-26 11:04
其他回答(3)
0

Func<TObject, bool> 是 一个参数为 TObject 类型的参数 返回值为bool 类型的匿名函数  eg:

Func<string, bool> func = delegate(string s) {

return true;
};

如何将多个Expression合并为一个呢?

 

ParameterExpression paraLeft = Expression.Parameter(typeof(int), "a");
ParameterExpression paraRight = Expression.Parameter(typeof(int), "b");
BinaryExpression binaryLeft = Expression.Multiply(paraLeft, paraRight);
ConstantExpression conRight = Expression.Constant(2, typeof(int));
BinaryExpression binaryBody = Expression.Add(binaryLeft, conRight);

Expression<Func<int, int, int>> lambda =
Expression.Lambda<Func<int, int, int>>(binaryBody, paraLeft, paraRight);

Func<int, int, int> myLambda = lambda.Compile();

int result = myLambda(2, 3);

仅供参考

 

Angkor--:-- | 园豆:1086 (小虾三级) | 2012-06-26 10:12
1

Func和Expresion<Func>可以说是类似的,不过,他们有个本质的区别:

在查询里使用EXPRESSION会适当的生成到SQL语句中,而Func则不会。

至于如何构建一个Expression,如果只是简单的,那么直接使用Func替代(也可以直接强制转换,默认下,对简单的,可以SQL语句实现的表达式会当作Expression,否则当作Func)

其它的构造方式,参考:

Linq表达式树问题

关于Expression<Func<T, TResult>>

无之无 | 园豆:5095 (大侠五级) | 2012-06-26 10:30
1

Expression,如果只是简单的,那么直接使用Func替代(也可以直接强制转换,默认下,对简单的,可以SQL语句实现的表达式会当作Expression,否则当作

<html>山匪</html> | 园豆:202 (菜鸟二级) | 2013-04-06 15:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册