2024-11-09 05:00:06

LINQ单对第一

LINQ:

当我确定查询将返回一条记录时,使用Single()操作符比First()更有效吗?

有区别吗?


当前回答

员工实体中的记录:

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。

其他回答

他们是不同的。它们都断言结果集不是空的,但single也断言结果集不超过1个。我个人在只希望有1个结果的情况下使用Single,因为返回超过1个结果是一个错误,可能应该这样对待。

如果不特别希望在有多个项的事件中抛出异常,请使用First()。

两者都很有效率,就拿第一项来说。First()的效率稍微高一些,因为它不需要检查是否有第二个项。

唯一的区别是,Single()期望枚举中只有一个项开始,如果有多个项,则会抛出异常。如果您特别希望在这种情况下抛出异常,则使用. single()。

我认识的很多人都使用FirstOrDefault(),但我更倾向于使用SingleOrDefault(),因为如果有多个,通常会出现某种数据不一致。不过,这是在处理LINQ-to-Objects。

这两种方法在语义上有细微的差别。

使用Single从一个序列中检索第一个(也是唯一一个)元素,该序列应该只包含一个元素。如果序列中有多个元素,则调用Single将导致抛出异常,因为您指示了应该只有一个元素。

使用First从可以包含任意数量元素的序列中检索第一个元素。如果序列中有多个元素,则调用First不会引发异常,因为您表示只需要序列中的第一个元素,而不关心是否存在更多元素。

如果序列不包含元素,两个方法调用都会引发异常,因为两个方法都希望至少有一个元素存在。

单()

返回查询的单个特定元素 When Use:如果恰好需要1个元素;不是0或大于1。如果列表为空或包含多个元素,则会抛出异常"Sequence contains more than one element"

SingleOrDefault ()

返回查询的单个特定元素,如果没有找到结果,则返回默认值 当使用:当需要0或1个元素时。如果列表有2个或更多项,它将抛出异常。

第()

返回带有多个结果的查询的第一个元素。 When Use:当需要1个或多个元素,而您只需要第一个元素时。如果列表中不包含元素,它将抛出异常。

FirstOrDefault ()

Returns the first element of a list with any amount of elements, or a default value if the list is empty. When Use: When multiple elements are expected and you want only the first. Or the list is empty and you want a default value for the specified type, the same as default(MyObjectType). For example: if the list type is list<int> it will return the first number from the list or 0 if the list is empty. If it is list<string>, it will return the first string from the list or null if the list is empty.