LINQ Where():这两个LINQ语句相同吗

本文关键字:LINQ 语句 两个 Where | 更新日期: 2023-09-27 18:30:04

有人能解释一下这两个Linq语句在执行方面是相同的还是不同的吗。我猜他们执行死刑的结果是一样的,但如果我错了,请纠正我。

var k = db.MySet.Where(a => a.Id == id).SingleOrDefault().Username;
var mo = db.MySet.SingleOrDefault(a => a.Id == id).Username;

LINQ Where():这两个LINQ语句相同吗

是的,两个指令在功能上是等效的,并且返回相同的结果。第二条只是一条捷径。

但是,我不建议这样写,因为如果没有指定Id的项,SingleOrDefault将返回null。当您访问Username时,这将导致NullReferenceException。如果您不希望它返回null,请使用Single,而不是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,它会建议你将前者改为后者。

然而,我通常会质疑,为什么您想要在不立即执行null检查的情况下执行SingleOrDefault()

我总是检查default(T),而不是检查null,正如LINQ函数的名称所暗示的那样。在我看来,如果类型被更改为结构或类,它的代码会更易于维护。

它们都将返回相同的结果(或者都将抛出NULL引用异常)。然而,第二种可能更有效。

第一个版本需要枚举所有满足where条件的值,然后检查是否只返回1个值。因此,此版本可能需要枚举超过100个值。

第二个版本将在开始时只检查一个符合条件的值。一旦该版本找到2个值,它就会抛出一个异常,因此它不会有枚举(可能)100个永远不会使用的值的开销。