2

我有 POCO 类映射数据库表: EDITED ------------------------------

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(它是一些非实体框架 lite 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

4

1 回答 1

1

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

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]);
});
于 2014-05-01T19:31:28.897 回答