0

使用 Entity Framework 查询数据时,以下哪种防御性检查更可取?

1.null支票:

user = users.SingleOrDefault(u => u.Email.Equals(email));

if(user == null)
{
    throw new Exception("Some critical error!");
}

OperationsOnUser(user);

2. LINQ的Any()

if(users.Any(u => u.Email.Equals(email)))
{
    user = users.Single(u => u.Email.Equals(email));
}
else
{
    throw new Exception("Some critical error!");
}

OperationsOnUser(user);

我个人使用第二个选项,因为它对我来说感觉更干净,但是我不是执行两个数据库调用而不是一个吗?我不确定实体框架的内部机制。

4

2 回答 2

2

我会引用 Jon Skeet 的话:

我总是建议任何实现类似 LINQ 的运算符的人只对任何输入序列进行一次迭代。有些序列不可能多次迭代,或者每次可能给出不同的结果。这是个坏消息。

保持只迭代一次的习惯。

对于您的示例,是的,您访问了两次数据库,这不是一个好主意。
事实上,你的第二个选项对我来说比第一个选项更混乱。您需要重新校准凌乱的探测器!:)

于 2013-04-12T09:37:39.443 回答
1

AakashM 的评论是正确的。但是要对此进行扩展,(1)更好,因为您正在对数据库执行一次操作,而在第二个示例中您要执行两次。一次看到它在那里,一次使用它。从我的角度来看,我认为答案是不言而喻的。

于 2013-04-12T09:34:52.217 回答