EDIT2:
在最终能够将两者相互对比之后,似乎在我的情况下.AsQueryable()比Expression.Compile()略快。
原始问题:
我已经实现了一些数据库表的缓存(如List<T>
),我需要使用与Expression<Func<T, bool>>
本身查询时相同的Table<T>
进行查询。
这些最快/最好的方式是什么:
List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)
或
List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())
编辑: 改变了FirstOrDefault的位置,因为这是我正在使用的方法。当我写这个问题时,我想我有点累了。 FirstOrDefault会像Where一样检查每个项目,还是第一次点击(如果有的话)实际停止?
答案 0 :(得分:1)
取决于您要执行的操作数以及表达式执行的处理器强度。
您可以使用秒表或其他诊断组件轻松测试。
答案 1 :(得分:1)
为什么要猜第二呢?用您的数据对其进行分析,看看哪种方法效果最好。
答案 2 :(得分:1)
与往常一样,确定更快速度的最佳方法是试用它,但是:
过滤列表&lt;&gt;使用简单的地方总是会导致每个项目被检查一次。没有进一步的假设,例如您的列表按特定顺序排序,实际上没有其他方法,这意味着您提供的两个版本将导致对表达式进行完全相同的评估。
如果你要多次使用相同的表达式,你可能会从编译它和缓存委托中受益,尽管数据必须很小并且表达式很复杂才能使它产生差异。< / p>
编辑:对于完全不依赖于任何输入的表达式来说,通过Queryable可能可能更快,例如()=&gt;假的。