Entity Framework的Find和Where的区别

45

.Find(id).Where(x =>x.Id == id)之间是否存在显著差异,这是否应该促使我使用.Find()而不是.Where()/.First()

我想.Find()会更高效,但它是否如此高效以至于我应该避免使用.Where()/.First()呢?

我之所以问这个问题,是因为我在我的测试中使用了一个通用的FakeDbSet,以便轻松实现虚拟结果。到目前为止,我发现我必须继承该类并提供.Find()的自定义实现,而如果我使用.Where()/.First()编写代码,我就不需要额外的工作。


2
你最好比较一下 FindSingleOrDefault,因为 Where 返回的是集合。 - Manu Clementz
虽然我总是使用 .First 或 .FirstOrDefault,但这是真的。 - Jimmy Bosse
4
@JimmyBosse,您可能需要考虑在仅需要匹配一条记录的情况下使用Single。 - Kyle
1个回答

57

Find()的重点在于它首先在上下文的本地缓存中搜索,如果没有匹配项,则发送查询到数据库。

调用Where()总是发送一个查询到数据库。

使用EF 4时,我曾经认为Find()生成的SQL太复杂,在某些情况下导致性能问题。因此,即使在EF 5中,我也总是使用Where()。我应该使用EF 5检查由Find()生成的SQL。

因此,在理论上,Find()更好,因为它使用缓存。


12
Find方法也不需要访问表达式树,因此如果需要访问数据库,它可以更快地查询到数据。而Where方法总是会经过一个ExpressionVisitor - vcsjones
2
由于缓存的存在,我能否避免获取不正确的数据?例如后台更新了数据库? - Zapnologica
2
当然可以。在检索记录后更新它时,您可能会遇到并发访问问题,或者由于隔离级别等原因也可能出现此问题... :) - tschmit007
1
它是否包括未提交的、已添加的实体?如果是,那在使用之前考虑这一点非常重要。 - xr280xr
能否更新一下答案,加入一些关于EF6/EF6Core的信息,如果有变化的话? - BeeDeeBePope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接