1

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

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

6 回答 6

10

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

但是,我不建议这样写,因为SingleOrDefault如果没有具有指定 ID 的项目,将返回 null。这将导致NullReferenceException当您访问Username. 如果您不希望它返回 null,请使用Single, not SingleOrDefault,因为如果您的期望未得到满足,它将为您提供更有用的错误消息。如果您不确定具有该 ID 的用户是否存在,请使用SingleOrDefault,但在访问其成员之前检查结果。

于 2013-09-02T12:44:50.463 回答
4

是的。这两个 linq 语句是相同的。但我建议你写这样的代码:

var mo = db.MySet.SingleOrDefault(a => a.Id == id);
if(mo !=null)
{
  string username=mo.Username;
}
于 2013-09-02T12:45:20.483 回答
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

于 2013-09-02T12:54:48.847 回答
2

它们在将执行的实际代码方面有所不同,但我看不出它们会给出不同结果的情况。实际上,如果您安装了 Resharper,它会建议您将前者更改为后者。

但是,我一般会质疑为什么您不想SingleOrDefault()立即进行null检查。

于 2013-09-02T12:45:14.177 回答
1

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

于 2013-09-02T12:54:40.013 回答
0

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

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

第二个版本将在开始时仅检查一个满足条件的值。一旦该版本找到 2 个值,它将引发异常,因此它没有枚举(可能)100 个永远不会使用的值的开销。

于 2013-09-02T12:52:25.123 回答