我正试图返回一个列表 ApplicationUser
属于不同 IdentityRole
和那些也不属于任何角色的用户。
所以当我进行测试时,我注意到下面的语句给了我系统中的所有用户。
UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);
对我来说,这条语句的意思应该是,如果用户没有角色,就应该把它作为集合的一部分返回,但显然在调试时,所有的用户都返回0的计数。
如果我使用适当的RoleManager来判断用户是否属于角色,我得到了正确的答案。
UserManager.IsInRole(applicationUser.Id, "Administrator");
所以我想知道它返回一个空集是否正常。
另外,在我的数据库中 aspnetuserroles
表的外键,以 identityusers
似乎指向了错误的列或代码更新到了错误的列。
CREATE TABLE `aspnetuserroles` (
`UserId` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
`RoleId` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
`IdentityUser_Id` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`UserId`,`RoleId`),
KEY `IdentityRole_Users` (`RoleId`),
KEY `IdentityUser_Id` (`IdentityUser_Id`),
CONSTRAINT `IdentityRole_Users` FOREIGN KEY (`RoleId`) REFERENCES `aspnetroles` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `IdentityUser_Roles` FOREIGN KEY (`IdentityUser_Id`) REFERENCES `identityusers` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
该表看起来是这样的: UserId
列有所有正确的用户ID,但没有被引用。IdentityUser_Id
列都是空的,不知道为什么被引用了。
非常感谢任何建议。
我做了一个小测试,发现当使用
UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);
我也得到了0个结果,尽管我知道肯定不应该是这样。于是,我决定看看调试器里发生了什么。其实是出错了,但我不看调试器就不知道。我不太清楚你想得到什么,但通过在最后抛出一个ToList(),像这样
UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0).ToList();
我开始得到预期的效果。希望对你也有用! 另外,使用下面的方法,我也得到了同样的结果。祝您好运!
UserManager.Users.Where(x => x.Roles.Count == 0).ToList();