有人可以解释这两个Linq语句是否相同,或者它们在执行方面是否有所不同。我猜测他们执行的结果是一样的,但如果我错了,请纠正我。
var k = db.MySet.Where(a => a.Id == id).SingleOrDefault().Username;
var mo = db.MySet.SingleOrDefault(a => a.Id == id).Username;
答案 0 :(得分:10)
是的,两条指令在功能上都是等效的,并返回相同的结果。第二个只是一个捷径。
但是,我不建议像这样编写它,因为如果没有指定Id的项目,SingleOrDefault
将返回null。当您访问NullReferenceException
时,这将导致Username
。如果您不希望它返回null,请使用Single
,而不是SingleOrDefault
,因为如果您的期望不满足,它会为您提供更有用的错误消息。如果您不确定具有该ID的用户是否存在,请使用SingleOrDefault
,但在访问其成员之前请检查结果。
答案 1 :(得分:4)
是肯定的。这两个linq语句是一样的。 但我建议你写这样的代码:
var mo = db.MySet.SingleOrDefault(a => a.Id == id);
if(mo !=null)
{
string username=mo.Username;
}
答案 2 :(得分:3)
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
答案 3 :(得分:2)
它们在执行的实际代码方面有所不同,但我看不出它们会给出不同结果的情况。事实上,如果您安装了Resharper,它会建议您将前者更改为后者。
但是,我一般会质疑为什么你想要SingleOrDefault()
而不立即用null
支票跟踪它。
答案 4 :(得分:1)
而不是检查null我总是检查默认值(T),因为LINQ函数的名称也暗示了。在我看来,如果将类型更改为结构或类,则可以使用更多可维护的代码。
答案 5 :(得分:0)
它们都将返回相同的结果(或两者都将抛出NULL引用异常)。但是,第二个可能更有效。
第一个版本需要枚举满足where条件的所有值,然后它将检查这是否仅返回1个值。因此,此版本可能需要枚举超过100的值。
第二个版本将仅检查一个符合开始条件的值。一旦该版本找到2个值,它就会抛出异常,因此它没有枚举(可能)永远不会使用的100个值的开销。