27

我一直Find(id)在 Entity Framework 5 中使用带有集合的扩展方法。但是,我看到的许多示例都使用Where(s => s.Id == 1),我添加FirstOrDefault()到其中以获取对象而不是集合。这是一种风格差异,还是明显 .Where() 偏好的功能原因?

4

2 回答 2

50

Find() 与 Where()、Single()、First() 等的根本区别在于,它会首先在内存中搜索对象,并且仅在对象尚未加载时才访问数据库。因此,尽可能尝试使用 Find(),因为它提供了从内存加载可能的速度优势。Find() 仅适用于主键,不支持 lambda,因此它不是很灵活。

Where() 通常用于获取对象列表。为了检索单个对象,我通常使用 Single()、SingleorDefault()、First()、FirstorDefault()。

Single() 和 SingleOrDefault() 与 First() 和 FirstOrDefault() 不同,因为它们确保最多一个对象可以满足有助于确保数据库中数据完整性的标准。他们的“Single”子句通过在 SQL 查询中选择“TOP 2”然后在返回两个实体时抛出异常来执行此操作。

请注意,您不应将这些链接到 Where() 子句的末尾。

所以而不是

.Where(s => s.Id == 1).FirstOrDefault();

利用:

.FirstOrDefault(s => s.Id == 1);

我写了一篇博文来全面探讨这个问题:http: //judeokelly.com/primer-on-selecting-data-using-entity-framework/

于 2013-02-06T03:57:49.940 回答
1

如果性能很重要,根据http://wp.secretnest.info/archives/2991,.Where(...).FirstOrDefault() 比 FirstOrDefault(...) 快得多。当然 List Find() 可能再次比以前快得多。

因此,与公认的答案相反,您不应该避免 Where(...).FirstOrDefault()!

于 2015-10-15T14:41:09.407 回答