实体框架查找与位置
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()
编写我的代码我不需要做那些额外的工作。
【问题讨论】:
你最好比较Find
和SingleOrDefault
,因为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 在后台更新?
是的,你可以。您还可以在检索记录后更新记录时遇到并发访问问题,或者由于隔离级别或... :)
它会包括未提交的、添加的实体吗?如果是这样,那么在使用之前需要考虑这一点。以上是关于实体框架查找与位置的主要内容,如果未能解决你的问题,请参考以下文章