FirstOrDefault()||选择()哪个更快?

时间:2009-08-21 20:35:15

标签: linq-to-sql

一般来说,假设1条记录被退回,是否比另一条更快?

使用一个比另一个好吗?

仅作为一个例子:

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

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

4 个答案:

答案 0 :(得分:2)

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

这可以返回多于1行,用于匹配记录(与FirstOrDefault相反)。

表现明智,我认为不应该有任何不同 它还取决于表中的行数? Id列是否已编入索引?

答案 1 :(得分:2)

FirstOrDefault会在找到结果后立即返回,因此它可以稍微快一些,但不会达到一个数量级...无论如何,您的第二个查询可以返回多个结果,所以这不是一个公平的比较。您可以将其与SingleOrDefault进行比较,这类似于Select,但只返回1个结果。

SingleOrDefault与Select一样,必须通过完整列表,但它保证您只获得一个结果。

注意:如果您使用的是Linq to SQL,那么第二次查询可能会更快,取决于您的索引......

答案 2 :(得分:1)

这可能会更快。

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

这取决于您使用的LINQ提供程序。如果你正在使用LINQ to Sql或Subsonic等,这可以转换为直接的SQL调用,它只会从数据库中获取一行。

在LINQ to Objects中,由于LINQ的结果流,这两个语句几乎完全相同。

答案 3 :(得分:1)

我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()代替,因为您正在寻找单个项目。如果您收到多条记录,SingleOrDefault()将会抛出。