用户登录身份验证SingleOrDefault()或FirstOrDefault()使用哪一个

时间:2015-04-09 15:46:34

标签: performance linq asp.net-mvc-4

我正在进行用户登录身份验证。我像这样制作LINQ查询:

var v = db.AppUsers.Where(a=>a.USERNAME.Equals(appUser.USERNAME) && a.PASSWORD.Equals(appUser.PASSWORD));

现在我要在会话变量中存储用户名,ID和角色。为此,我应该使用什么,

 var v = db.AppUsers.Where(a=>a.USERNAME.Equals(appUser.USERNAME) && a.PASSWORD.Equals(appUser.PASSWORD)).FirstOrDefault();

     or SingleOrDefault().

请建议使用SingleOrDefault()或FirstOrDefault()。 哪个是最快且更优化的

请注意,USERNAME在这里是唯一的。

1 个答案:

答案 0 :(得分:1)

FirstOrDefaultSingleOrDefault之间的唯一区别是他们从RDBMS检索数据后所做的事情:

  • SingleOrDefault检查是否有更多数据,如果有第二行则抛出异常
  • FirstOrDefault只返回第一行

如果保证行是唯一的,那么从性能角度来看,使用FirstOrDefault可以节省十几个CPU周期。然而,操作主要由RDBMS时序控制,你不太可能看到任何差异。

另一方面,从可读性的角度来看,唯一记录的检索应该看起来像是对唯一记录的检索,而不是检索第一条记录。使用SingleOrDefault有两个好处:

  • 它告诉您的读者记录必须是唯一的,否则就是错误
  • 它在运行时检查最多只有一条记录,并在您的逻辑被破坏时提醒您。

这就是为什么我会使用SingleOrDefault - 更加小心,值得超过十几个CPU周期。