C# 为什么不直接在Equals()中使用对象属性?

C# 为什么不直接在Equals()中使用对象属性?,c#,.net,equality,C#,.net,Equality,我正忙着调整我自己的MS assembly分支Microsoft.AspNet.Identity.EntityFramework来使用NHibernate,我注意到大量的代码如下: var userId = user.Id; var roleId = role.Id; return await _userRoles.AnyAsync(ur => ur.RoleId.Equals(roleId) && ur.UserId.Equals(userId)).WithCurrent

我正忙着调整我自己的MS assembly分支Microsoft.AspNet.Identity.EntityFramework来使用NHibernate,我注意到大量的代码如下:

var userId = user.Id;
var roleId = role.Id;
return await _userRoles.AnyAsync(ur => ur.RoleId.Equals(roleId) && ur.UserId.Equals(userId)).WithCurrentCulture();
为什么不用这个

return await _userRoles.AnyAsync(ur => ur.RoleId.Equals(role.Id) && ur.UserId.Equals(user.Id)).WithCurrentCulture();

因为在
AnyAsync
将表达式转换为SQL之前,
user.Id
很可能会发生变化。无法保证表达式会立即求值,因此引用临时局部变量是有意义的


例如,在与数据库建立连接之前不生成SQL可能是有意义的。

第二个代码是否给出了一些错误或只是返回null?这些调用是否针对数据库?也许避免通过变量访问某个值会使查询计划更容易缓存。@ArijitMukherjee不,它似乎也能起到同样的作用。