如果我不使用 SQL,与链接 Funcs 相比,使用表达式构建动态 LINQ 查询是否有好处?

Is there a benefit in using Expressions to build dynamic LINQ queries compared to chaining Funcs if I am not using SQL?

我需要构建一个动态查询,该查询可以查询大量对象并获取满足 运行 时已知的复杂谓词的对象。我知道我想提前完成并将其传递到集合中进行过滤,而不是在集合本身上创建一些复杂的 switch case。

一切都指向表达式和谓词生成器,我很乐意用它在循环中将表达式链接在一起,例如:

Expression<Func<MyObject, bool>> query = PredicateBuilder.True<MyObject>();
query = query.And(x => x.Field == passedInSearchCriterion)

但我也可以这样做:

Func<MyObject, bool> query = x => true;
query = x => query(x) && (x => x.Field == passedInSearchCriterion)

我知道第一个更好 因为 在 LINQ 的情况下 SQL 将其转换为 SQL 以在数据库中执行等entity framework 什么的。

但是假设它们都是 运行 本地的,而不是在数据库中,在一个大列表中,那么在结果函数的执行方式方面是否存在任何性能差异?

I know the first is better because of LINQ to SQL converting it to SQL to execute in the database etc when given to entity framework or something.

不,你“不知道”它更好,因为你不理解表达式和委托之间的区别。

主要区别在于表达式是一段代码的有效描述,可以通过检查来查找参数名称等信息——这就是 ORM 使用它们的原因,将 POCO 映射到 SQL 列——而委托只不过是指向要执行的方法的指针。因此,C# 编译器可以对委托执行一些优化,而它不能对表达式执行这些优化。 Further details here.

所以是的,会有性能差异,几乎可以肯定有利于代表。这种差异是否可以量化 and/or 与您的用例相关,只有您可以通过基准测试来确定。

但是无论如何,任何性能差异都无关紧要,因为您的用例不需要表达式。只需使用委托,它总是会更快。