实体框架查找与位置

Posted

技术标签:

【中文标题】实体框架查找与位置【英文标题】:Entity Framework Find vs. Where 【发布时间】:2013-06-02 16:54:54 【问题描述】:

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

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

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

【问题讨论】:

你最好比较FindSingleOrDefault,因为Where返回集合。 没错,虽然我总是使用 .First 或 .FirstOrDefault。 @JimmyBosse 对于只有 1 条记录应该匹配的任何情况,您可能需要考虑使用 Single。 【参考方案1】:

重点是Find()首先在上下文的本地缓存中进行搜索,然后如果不匹配,则向数据库发送查询。

调用Where() 总是向数据库发送查询。

对于 EF 4,我曾经认为Find() 生成的 SQL 过于复杂,并且在某些情况下会导致性能问题。所以我总是使用Where(),即使是EF 5。我应该用EF 5检查Find()生成的SQL。

所以在纸面上,Find() 更好,因为它使用缓存。

【讨论】:

+1。 Find 也没有访问表达式树的开销,因此它可以更快地访问数据库,如果它确实访问了数据库。哪里总是通过ExpressionVisitor 由于缓存的原因,我不能得到不正确的数据吗?即 Db 在后台更新? 是的,你可以。您还可以在检索记录后更新记录时遇到并发访问问题,或者由于隔离级别或... :) 它会包括未提交的、添加的实体吗?如果是这样,那么在使用之前需要考虑这一点。

以上是关于实体框架查找与位置的主要内容,如果未能解决你的问题,请参考以下文章

测试实体框架查找方法

FluentValidation 和实体框架查找

实体框架,查找方法将外键留空

实体框架 4.1 创建重复的查找条目

实体框架将纯连接查找表转换为多对多关系

用于从 LastOrDefault 父项中查找子项的实体框架 LINQ