LINQ Where():这两个LINQ语句是一样的吗?

时间:2013-09-02 12:42:59

标签: c# linq

有人可以解释这两个Linq语句是否相同,或者它们在执行方面是否有所不同。我猜测他们执行的结果是一样的,但如果我错了,请纠正我。

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

6 个答案:

答案 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个值的开销。