AsQueriable()或Expression <t> .Compile()?</t>

时间:2009-10-30 09:31:21

标签: c# linq-to-sql lambda where-clause

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一样检查每个项目,还是第一次点击(如果有的话)实际停止?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

与往常一样,确定更快速度的最佳方法是试用它,但是:

过滤列表&lt;&gt;使用简单的地方总是会导致每个项目被检查一次。没有进一步的假设,例如您的列表按特定顺序排序,实际上没有其他方法,这意味着您提供的两个版本将导致对表达式进行完全相同的评估。

如果你要多次使用相同的表达式,你可能会从编译它和缓存委托中受益,尽管数据必须很小并且表达式很复杂才能使它产生差异。< / p>

编辑:对于完全不依赖于任何输入的表达式来说,通过Queryable可能可能更快,例如()=&gt;假的。