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

Linq ConcurrentDictionary 角色和用户多对多

对于链接,我将在中间表上循环并使用分词查找来访问用户和角色。

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]);
});