是Find和Where().FirstOrDefault()是等价的吗?

Tho*_*mee 26 .net linq linq-to-entities entity-framework entity-framework-5

我已经使用了Find(id)与实体框架5.但是集合扩展方法,很多的例子我看到的使用Where(s => s.Id == 1),而我加入FirstOrDefault()来获取对象,而不是一个集合.这是一种风格差异,还是有明显的.Where()偏好的功能原因?

Jud*_*udo 46

Find()与Where(),Single(),First()等有根本区别,因为它首先在内存中搜索对象,如果尚未加载对象,则只访问数据库.因此,尝试尽可能使用Find(),因为它提供了从内存加载的可能的速度优势.Find()仅适用于主键,不支持lambdas,因此不够灵活.

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

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

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

而不是

.Where(s => s.Id == 1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

使用:

.FirstOrDefault(s => s.Id == 1);
Run Code Online (Sandbox Code Playgroud)

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

  • 编写简洁代码的大多数指导都是主观的.是什么意思添加Where()子句?它会让它更清晰吗?如果是这样的话.如果不是省略它,代码更短. (7认同)
  • 这是主观的. (5认同)
  • 为什么不使用`.Where(s => s.Id == 1).FirstOrDefault()`而不是`.FirstOrDefault(s => s.Id == 1)`?在您的博客中,您声明使用第一个语句没有任何优势,但您没有提到任何缺点.如果确实没有缺点,那么这是一个偏好问题,你*可以*使用第二个语句而不是*should*. (4认同)
  • 关键是两者都是等价的,在这种情况下,最简单和最容易阅读. (4认同)
  • 通过使用.firstOrDefault(condition)而不是.Where(condition).FirstOrDefault(),可以降低代码性能. (2认同)