我下面有这些扩展方法,2个来自ClaimsPrincipal,一个来自UserManager,都是提取电子邮件。
有什么区别,哪个更快?(即不需要太多的时间从数据库中获取,或者根本不从数据库中获取,或者它们都从数据库中获取?
var email = HttpContext.User.GetUserEmail();
public static string GetUserEmail(this ClaimsPrincipal user) {
return user.FindFirst(ClaimTypes.Email)?.Value;
}
var email = HttpContext.User.RetrieveEmailFromPrincipal();
public static string RetrieveEmailFromPrincipal(this ClaimsPrincipal user) {
return user?.Claims?.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value;
}
var ca = await _userManager.Users
.Where(p => p.Id == d)
.Select(p => p.Email)
.FirstOrDefaultAsync();
1条答案
按热度按时间q8l4jmvw1#
GetUserEmail()
和RetrieveEmailFromPrincipal()
是ClaimsPrincipal
对象的扩展方法。他们正在从索赔中检索用户的电子邮件地址。如果你检查FindFirst()
的实现,你会发现它使用与FirstOrDefault()
相同的foreach
循环进行迭代。两者之间的差异主要是风格上的,在表现上没有显著差异。这两种方法的时间复杂度非常相似。它们都必须扫描用户的声明列表,直到找到所需类型的声明。
第三种方法使用实体框架从数据库中检索用户的电子邮件地址。
通常,
ClaimsPrincipal
上的扩展方法会更快,因为声明已经在内存中(在身份验证过程中检索),不需要往返数据库。但是,它们要求电子邮件声明已经添加到用户的声明中,这可能并不总是这样,这取决于应用程序的设置方式。有关获取用户数据How to get the current logged in user ID in ASP.NET Core?的详细信息,请阅读本文