首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expression<Func<T,Boolean>>对Func<T,Boolean>

Expression<Func<T,Boolean>>对Func<T,Boolean>
EN

Stack Overflow用户
提问于 2015-03-04 20:45:10
回答 2查看 496关注 0票数 1

我刚刚遇到了表达式树,我发现与LINQ一起使用它们比只使用Func<T, Boolean>更好。但是,我发现不能将表达式直接传递给LINQ方法,比如Select方法。但我发现有一个与表达式关联的Compile方法,该方法将其转换为正常的Func。现在我一直在想,它是否是调用表达式的正确方法(通过使用编译方法),如果是这样,那么FuncExpression之间的区别是什么。如果它不是正确的方法,那么如何使用它,例如传递如下:

代码语言:javascript
复制
Expression<Func<T, Bool>> Test

代码语言:javascript
复制
Data.Where(Test) --> Test can't be passed to it directly 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-04 20:50:39

使用Expression vs Func确实取决于您的用例和您正在使用的Linq提供者。

如果您使用的是实体框架、Linq到SQL或将表达式树转换为其他查询语言的任何其他查询提供程序,则必须使用Expression

如果将Linq用于对象,则可以选择。通常,您希望直接使用Func,而不首先创建表达式,然后编译表达式。

如果需要在运行时构建任意和复杂的查询,则可以使用Expression。在本例中,您将在执行查询之前调用compile。这方面的常见示例是用户通过UI提供复杂的搜索查询。

票数 6
EN

Stack Overflow用户

发布于 2015-03-04 21:07:50

基本上,表达式树是一种数据结构,可以编译成可执行的代码,也可以编译成可执行的代码。

有些方法要求您提供表达式树,因为它们需要分析表达式中的内容,以便它在此基础上作出决策。另外,LINQ提供程序针对像SQL这样的数据源执行这些表达式,对它们进行分析,将代码转换为特定的SQL方言。

在上述情况下,表达式树永远不会被编译。

此外,如果不构建基于条件和用例的可执行代码,则不希望使用表达式树的路径来解决任何问题。如果您只是声明表达式树,因为您发现它们很强大,您就没有正确的方法,因为您增加了额外的开销,将它们编译到委托以使它们可执行.

我还要补充的是,表达式树非常强大,因为它实际上就像使用抽象语法树构建C#代码一样,而常规的语言编译流程是将人类编程语言(如C# )转换为AST,然后转换为中间语言或机器代码。换句话说,这就像有一个运行时编译器。

在.NET早期,这只能使用反射发射、Mono或其他中间语言编织器,想象一下您将如何使用.NET中间语言编写类似于.NET的东西…!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28864548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档