因为我找到了解决方案,所以比实际问题更清晰。我只是不明白其中的道理...
使用 SQLite 3.8.3.1 使用 SQLite-net 2.1
.Where(lambda).FirstOrDefault()
我看到运行 a和运行 a之间的明显区别.FirstOrDefault(lambda)
。
就我在 Linq 方面的经验而言,数据库 LINQ 提供程序对这两者的处理基本相同(.FirstOrDefault(lambda)
如果优化得当,可能会快一点,但总的来说,这两个调用的运行时间大致相同)。
但是,在 SQLite-net 中,我在一个包含约 40,000 条记录的表上看到以下结果:
运行时.FirstOrDefault(x => x.Id == id)
,我看到 Core-i7 的时间在2200 毫秒到 3700 毫秒之间。在 Surface RT(第一代)上,这实际上需要大约 20,000 毫秒到 30,000 毫秒。
运行时.Where(x => x.Id == id).FirstOrDefault()
,我看到相同 Core-i7 的时间在16ms-20ms之间。在 Surface RT 上,这大约需要 30 毫秒。
我的问题是这是否只是一个错误,或者这是否是一个有意识的设计决定。如果这是一个设计决定——我很想了解它背后的原因。