FindAsync仅支持主键查询还是可构造复杂查询?ASP.NET Core Identity场景疑问
代码逻辑解答
你不需要担心参数匹配错误的问题,这段代码最终生成的SQL就是你预期的多条件AND查询,完全不会出现「在UserId列检索LoginProvider、Name参数值」的情况,核心逻辑是这样的:
- EF Core内置的
FindAsync方法接收的对象数组参数,是按实体定义的复合主键字段顺序传入的各个主键值,会自动映射到对应的主键字段生成查询条件。 - ASP.NET Core Identity里的
TUserToken(默认对应IdentityUserToken类)的主键就是UserId、LoginProvider、Name三个字段组成的复合主键,字段声明顺序刚好和代码里传入参数的顺序一致,所以三个值会分别匹配三个主键字段。
最终生成的SQL和你写的完全一致:
select * from AspNetUserTokens where UserId = @userId and LoginProvider = @loginProvider and Name = @name
设计合理性说明
这个复合主键的设计是完全符合业务需求的:
- 同一个用户可以对接多个第三方登录提供商(比如谷歌、微信、GitHub),也可以有系统本身生成的业务令牌(比如密码重置、邮箱验证、双因素认证令牌)
- 同一个登录提供商下,同一个用户也会有不同用途的令牌,用
Name字段做区分 - 三个字段组成复合主键,既可以保证全局唯一不会出现重复令牌记录,也能利用主键索引的最高查询性能,比普通的非主键多条件查询效率更高。
内容的提问来源于stack exchange,提问作者Navid_pdp11
相关产品推荐
相关产品推荐

