LINQ:
当我确定查询将返回一条记录时,使用Single()操作符比First()更有效吗?
有区别吗?
LINQ:
当我确定查询将返回一条记录时,使用Single()操作符比First()更有效吗?
有区别吗?
当前回答
他们是不同的。它们都断言结果集不是空的,但single也断言结果集不超过1个。我个人在只希望有1个结果的情况下使用Single,因为返回超过1个结果是一个错误,可能应该这样对待。
其他回答
他们是不同的。它们都断言结果集不是空的,但single也断言结果集不超过1个。我个人在只希望有1个结果的情况下使用Single,因为返回超过1个结果是一个错误,可能应该这样对待。
员工实体中的记录:
Employeeid = 1:只有一个具有此ID的员工
罗伯特:不止一个员工叫这个名字
Employeeid = 10:没有该ID的员工
现在有必要详细理解Single()和First()的含义。
单()
Single()用于返回表中唯一存在的单个记录,因此下面的查询将返回employeed =1的Employee,因为我们只有一个employeed为1的Employee。如果EmployeeId = 1有两条记录,那么它会抛出一个错误(请参阅下面第二个查询中的错误,其中我们使用了Firstname的示例。
Employee.Single(e => e.Employeeid == 1)
上面的操作将返回一条记录,该记录有1个employeeId
Employee.Single(e => e.Firstname == "Robert")
上面将抛出一个异常,因为表中有多个FirstName='Robert'的记录。唯一的例外是
InvalidOperationException:序列包含多个元素
Employee.Single(e => e.Employeeid == 10)
这将再次抛出异常,因为id=10的记录不存在。唯一的例外是
InvalidOperationException:序列不包含元素。
对于EmployeeId = 10,它将返回null,但是由于我们正在使用Single(),它将抛出一个错误。为了处理空错误,我们应该使用SingleOrDefault()。
第()
First()从多个记录中返回按出生日期升序排序的相应记录,因此它将返回年龄最大的'Robert'。
Employee.OrderBy(e => e. Birthdate)
.First(e => e.Firstname == "Robert")
以上应返回最老的,罗伯特按照DOB。
Employee.OrderBy(e => e. Birthdate)
.First(e => e.Employeeid == 10)
以上将抛出异常,因为id =10的记录不存在。 To avoid a null exception we should use FirstOrDefault() rather than First().
注意:当我们绝对确定First()/Single()不能返回空值时,我们只能使用它。
在这两个函数中使用SingleOrDefault()或FirstOrDefault()来处理 空异常,在没有找到记录的情况下,它将返回null。
如果不特别希望在有多个项的事件中抛出异常,请使用First()。
两者都很有效率,就拿第一项来说。First()的效率稍微高一些,因为它不需要检查是否有第二个项。
唯一的区别是,Single()期望枚举中只有一个项开始,如果有多个项,则会抛出异常。如果您特别希望在这种情况下抛出异常,则使用. single()。
你可以尝试简单的例子来得到不同。 异常将在第3行抛出;
List<int> records = new List<int>{1,1,3,4,5,6};
var record = records.First(x => x == 1);
record = records.Single(x => x == 1);
关于性能:我和一个同事正在讨论Single vs First(或SingleOrDefault vs FirstOrDefault)的性能,我认为First(或FirstOrDefault)会更快并提高性能(我都是关于让我们的应用程序运行得更快)。
I’ve read several posts on Stack Overflow that debate this. Some say there are small performance gains using First instead of Single. This is because First would simply return the first item while Single must scan all the results to make sure there isn’t a duplicate (ie: if it found the item in the first row of the table, it still would scan every other row to make sure there isn’t a second value matching the condition which would then throw an error). I felt like I was on solid ground with “First” being faster than “Single” so I set out to prove it and put the debate to rest.
我在我的数据库中设置了一个测试,并添加了1,000,000行 ID UniqueIdentifier 外国UniqueIdentifier 信息nvarchar(50)(用数字“0”到“999,9999”的字符串填充)
我加载了数据,并将ID设置为主键字段。
使用LinqPad,我的目标是展示如果你使用Single在“Foreign”或“Info”上搜索一个值,它会比使用First差得多。
我无法解释我得到的结果。在几乎所有情况下,使用Single或SingleOrDefault略快一些。这对我来说没有任何逻辑意义,但我想分享一下。
例:我使用了以下查询:
var q = TestTables.First(x=>x.Info == "314638") ;
//Vs.
Var q = TestTables.Single(x=>x.Info =="314638") ; //(this was slightly faster to my surprise)
我在“外”键字段上尝试了类似的查询,没有索引,认为这将证明第一是更快的,但在我的测试中,单一总是略快。