FirstOrDefault()和sqlite-net中Where()之间的语义差异

时间:2014-04-20 21:25:40

标签: c# performance linq sqlite sqlite-net

更清晰的问题而不是实际的问题,因为我找到了解决方案。我只是不理解推理......

使用SQLLite 3.8.3.1使用SQLite-net 2.1

我发现在运行.Where(lambda).FirstOrDefault()与运行.FirstOrDefault(lambda)之间存在明显差异。

就我对Linq的经验而言,数据库LINQ提供商会将这两者基本相同(.FirstOrDefault(lambda)如果能够正确优化可能会更快一些,但总的来说,这两者呼叫将花费大致相同的时间来运行)。

然而,在SQLite-net中,我在一个包含约40,000条记录的表中看到以下结果:

运行.FirstOrDefault(x => x.Id == id)时,我发现Core-i7的时间介于 2200ms至3700ms 之间。在Surface RT(第一代)上,这实际上需要大约20,000ms-30,000ms ..

运行.Where(x => x.Id == id).FirstOrDefault()时,我看到同一Core-i7的时间介于 16ms-20ms 之间。在Surface RT上,这需要大约30ms。

我的问题是,这只是一个错误,还是一个有意识的设计决定。如果这是一个设计决定 - 我很想理解它背后的原因。

1 个答案:

答案 0 :(得分:3)

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

理论上,可以将后者自动转换为前者,但实际上,这并没有完成。 这既不是有意识的设计决定,也不是错误;它只是一个理论上可能的优化尚未实现。

相关问题