1

因为我找到了解决方案,所以比实际问题更清晰。我只是不明白其中的道理...

使用 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 毫秒。

我的问题是这是否只是一个错误,或者这是否是一个有意识的设计决定。如果这是一个设计决定——我很想了解它背后的原因。

4

1 回答 1

3

.Where直接翻译成 SQL WHERE 子句,同时.FirstOrDefault(lambda)从数据库中读取未过滤的记录,然后检查它们是否匹配。

理论上,可以将后者自动翻译成前者,但实际上并没有这样做。这既不是有意识的设计决定,也不是错误;这只是理论上可能的优化尚未实施。

于 2014-04-20T22:16:42.693 回答