You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

User.FindFirstValue(ClaimTypes.NameIdentifier)是否查询数据库?会产生额外请求吗?

问题1解答

User.FindFirstValue(ClaimTypes.NameIdentifier) 不会查询数据库。
ASP.NET Core 身份验证中间件会在请求到达业务代码前,就把加密存储在Cookie(默认Cookie认证场景)或请求头JWT中的用户声明信息解密解析完毕,全部存入User对象的Claims集合中,这一步是纯内存操作,没有任何数据库IO开销。

问题2解答

你给出的第二段代码只会产生1次数据库请求:

  • 读取用户ID的操作是从内存的User对象中取值,无IO
  • 只有后续EF Core的FirstOrDefaultAsync调用会触发一次带Include关联查询的数据库请求,不存在两次往返的问题,这个写法是完全合规的优化方案。
Guid uId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier));
ApplicationUser user = await db.Users
    .Include(c => c.City)
    .Where(u => u.Id == uId).FirstOrDefaultAsync();

问题3解答

你的判断是正确的,第三段代码确实会产生2次数据库请求:

  • _userManager.GetUserAsync(User) 内部默认会根据用户声明的ID去数据库查询一次完整的ApplicationUser对象
  • 后续你自己写的EF查询又会按ID再查询一次带关联属性的用户对象,两次查询完全重复,会产生不必要的性能损耗。
// 以下代码会触发两次数据库查询,不推荐
var usr = await _userManager.GetUserAsync(User);
ApplicationUser user = await db.Users
    .Include(c => c.City)
    .Where(u => u.Id == usr.Id).FirstOrDefaultAsync();

内容的提问来源于stack exchange,提问作者Stian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:18:03