有人可以解释这两个 Linq 语句是否相同,或者它们在执行方面是否不同。我猜他们的执行结果是一样的,但如果我错了,请纠正我。
var k = db.MySet.Where(a => a.Id == id).SingleOrDefault().Username;
var mo = db.MySet.SingleOrDefault(a => a.Id == id).Username;
是的,两条指令在功能上是等效的并且返回相同的结果。第二个只是一个捷径。
但是,我不建议这样写,因为SingleOrDefault
如果没有具有指定 ID 的项目,将返回 null。这将导致NullReferenceException
当您访问Username
. 如果您不希望它返回 null,请使用Single
, not SingleOrDefault
,因为如果您的期望未得到满足,它将为您提供更有用的错误消息。如果您不确定具有该 ID 的用户是否存在,请使用SingleOrDefault
,但在访问其成员之前检查结果。
是的。这两个 linq 语句是相同的。但我建议你写这样的代码:
var mo = db.MySet.SingleOrDefault(a => a.Id == id);
if(mo !=null)
{
string username=mo.Username;
}
var k = db.MySet.Where(a => a.Id == id).SingleOrDefault().Username;
var mo = db.MySet.SingleOrDefault(a => a.Id == id).Username;
你问它们是否相等...
是的,它们将在 LINQ-to-Objects 和 LINQ-to-SQL/Entity-Framework 中返回相同的结果
不,它们不相等,在 LINQ-to-Objects 中相等。有人对它们进行了基准测试,发现第一个更快一些(因为.Where()
基于类型的特殊优化db.MySet
)参考:https ://stackoverflow.com/a/8664387/613130
它们在将执行的实际代码方面有所不同,但我看不出它们会给出不同结果的情况。实际上,如果您安装了 Resharper,它会建议您将前者更改为后者。
但是,我一般会质疑为什么您不想SingleOrDefault()
立即进行null
检查。
正如 LINQ 函数的名称所暗示的那样,我总是检查 default(T) 而不是检查 null。在我看来,如果类型更改为结构或类,它的代码更易于维护。
它们都将返回相同的结果(或者两者都将抛出 NULL 引用异常)。但是,第二种可能更有效。
第一个版本需要枚举所有满足 where 条件的值,然后检查是否只返回 1 个值。因此,此版本可能需要枚举超过 100 个值。
第二个版本将在开始时仅检查一个满足条件的值。一旦该版本找到 2 个值,它将引发异常,因此它没有枚举(可能)100 个永远不会使用的值的开销。