代码之家  ›  专栏  ›  技术社区  ›  Mike Fielden

FirstOrDefault()Select()哪个更快?

  •  1
  • Mike Fielden  · 技术社区  · 15 年前

    一般来说,假设返回了1条记录,那么一条记录比另一条记录快吗?

    使用一个对另一个有好处吗?

    举个例子:

    DataContext.TableBlah.FirstOrDefault(_blah => _blah.id == 1);
    

    var test = (from blah in TableBlah
                where blah.id == 1
                select blah)
    
    4 回复  |  直到 15 年前
        1
  •  1
  •   Randolpho    15 年前

    我90%确信

    var test = dc.TableBlah.FirstOrDefault(_blah => _blah.id == 1);
    

    设置与完全相同的表达式树

    var test = (from blah in dc.TableBlah
                where blah.id == 1
                select blah).FirstOrDefault();
    

    所以您的第二个示例缺少通过调用 FirstOrDefault() . 在性能方面,它们是相同的。

    我个人会用 SingleOrDefault() 相反,因为你在找一件物品。 单个或默认值() 如果您收到多个记录,将抛出。

        2
  •  2
  •   shahkalpesh    15 年前
    var test = (from blah in TableBlah
                where blah.id == 1
                select blah)
    

    这可以返回1行以上,用于匹配记录(与 FirstOrDefault )

    从性能上讲,我不认为会有什么不同。
    它还取决于表中的行数?是否为ID列编制了索引?

        3
  •  2
  •   Meta-Knight    15 年前

    first或default一找到结果就返回,所以速度可以稍微快一点,但不能达到数量级…不管怎样,第二个查询可以返回多个结果,因此这不是一个公平的比较。你可以把它和 SingleOrDefault 相反,这类似于选择,但只返回1个结果。

    singleOrDefault和select一样,必须遍历完整的列表,但它保证您只能得到一个结果。

    注意:如果您使用的是linq-to-sql,那么第二个查询可能更快,这取决于您的索引…

        4
  •  1
  •   Reed Copsey    15 年前

    这可能更快。

    var test = (from blah in TableBlah
            where blah.id == 1
            select blah)
    

    这取决于您使用的LINQ提供者。如果您使用的是linq-to-sql或subsonic等,则可以将其转换为直接的SQL调用,该调用只从数据库中提取一行。

    在linq to对象中,由于结果的linqs流,这两个语句将几乎相同。