0

Edit2:
在最终能够对两者进行分析之后,在我的情况下,.AsQueryable() 似乎比 Expression.Compile() 稍快。

原始问题:
我已经实现了一些数据库表(as List<T>)的缓存,我需要使用与查询自身Expression<Func<T, bool>>时相同的方式进行查询。Table<T>

这些中最快/最好的方法是什么:

List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)

或者

List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())

?

编辑:将 Where 更改为 FirstOrDefault,因为这是我正在使用的方法。我想我写这个问题的时候有点累。FirstOrDefault 会像 Where 一样检查每个项目,还是会在第一次点击时停止(如果有的话)?

4

3 回答 3

1

取决于您要执行多少操作,以及您的表达式执行的处理器强度。

您可以使用秒表或其他诊断组件轻松测试。

于 2009-10-30T09:37:28.850 回答
1

为什么要第二次猜测呢?使用您的数据对其进行分析,看看哪个效果最好。

于 2009-10-30T09:44:35.190 回答
1

与往常一样,确定更快的最佳方法是尝试一下,但是:

使用简单的 Where 过滤 List<> 将始终导致每个项目被检查一次。如果没有进一步的假设,例如您的列表按特定顺序排序,实际上没有其他方法,这意味着您提供的两个版本将导致对表达式的完全相同的评估。

如果您要多次使用同一个表达式,您可能会从编译它和缓存委托中受益,尽管数据必须很小并且表达式很复杂才能发挥作用。

编辑:对于实际上根本不依赖任何输入的表达式,例如 () => false,通过 Queryable可能会更快。

于 2009-10-30T09:48:42.460 回答