微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我需要构建一个动态查询,该查询可以查询大量对象并获取满足运行时已知的复杂谓词的对象。我知道我想预先完成并将其传递到集合中进行过滤,而不是在集合本身上创建一些复杂的 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 to sql 的情况下,当给实体框架或其他东西时,将其转换为 sql 以在数据库中执行等。

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

解决方法

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。