Linq ConcurrentDictionary 角色和用户多对多
本文关键字:用户 ConcurrentDictionary 角色 Linq | 更新日期: 2023-09-27 18:34:51
我有 POCO 类映射数据库表:编辑------------------------------
class Role { string Id; ConcurrentDictionary<string, User> Users; }
class User { string Id; ConcurrentDictionary<string, Roles> Roles; }
class RoleUser { string Id; string RoleId; string UserId; }
ConcurrentDictionary<string, Role> RolesDict;
ConcurrentDictionary<string, User> UsersDict;
ConcurrentDictionary<string, RoleUser> RoleUserDict;
我正在使用ServiceStack的ORMLite(它是一些非实体框架精简版ORM(,因此它似乎没有自动关系映射到集合。我做 Linq 语句来映射Role-RU-User
之间的这种多对多关系。这是 Linq:
//cleaning old data
UsersDict.ForEach(kvUser => kvUser.Value.Roles.Clear());
//for each role ...
RolesDict.ForEach(kvRole => {
//cleaning old data
kvRole.Value.Users.Clear();
//find users that belong to the role
var users = (from ru in RoleUserDict
join u in UsersDict on ru.Value.UserId equals u.Value.Id
where ru.Value.RoleId == kvRole.Value.Id
select u).ToList();
//couple them up
users.ForEach(kvUser => {
kvRole.Value.Users.TryAdd(kvUser.Key, kvUser.Value);
kvUser.Value.Roles.TryAdd(kvRole.Key, kvRole.Value);
});
});
我不擅长 Linq,我不确定在这种情况下如何处理多对多关系。我的代码对我来说看起来很糟糕。特别是那些笨重的嵌套 ForEach(( 循环。
我的问题是:是否有一种更优雅的方法,具有更好外观的代码和更好的性能?
感谢Linq & Lambda专家:D
对于链接,我将在中间表上循环并使用分词查找来访问用户和角色。
UsersDict.ForEach(kvUser => kvUser.Value.Roles.Clear());
RolesDict.ForEach(kvRole => kvRole.Value.Users.Clear());
RoleUserDict.ForEach(kvRoleUser => {
UsersDict[kvRoleUser.Value.UserId].Roles.TryAdd(kvRoleUser.Value.RoleId, RolesDict[kvRoleUser.Value.RoleId]);
RolesDict[kvRoleUser.Value.RoleId].Users.TryAdd(kvRoleUser.Value.UserId, UsersDict[kvRoleUser.Value.UserId]);
});