如果我不使用SQL,那么与链接函数相比,使用表达式构建动态LINQ查询有好处吗



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

所有的东西都指向表达式和谓词生成器,我很乐意使用它们将表达式链接在一个循环中,比如:

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以在数据库中执行的情况下,当被赋予实体框架或其他东西时,第一个更好。

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

我知道第一个更好,因为当被赋予实体框架或其他东西时,LINQ到SQL将其转换为SQL以在数据库中执行。

不,你不"知道";这更好,因为您不了解表达式和代理之间的区别。

主要区别在于,表达式实际上是对一段代码的描述,可以通过检查来查找参数名称等信息——这就是ORM使用它们将POCO映射到SQL列的原因——而委托只不过是指向要执行的方法的指针。因此,C#编译器可以对委托执行一些优化,而对表达式则无法执行这些优化。此处提供更多详细信息。

因此,是的,会有一个表现上的差异,几乎可以肯定的是,有利于代表。这种差异是否可以量化和/或与您的用例相关,只有您才能通过基准来确定。

但是任何性能差异都是无关紧要的,因为您的用例不需要表达式。只需使用代理,这将始终更快。

最新更新