2013-10-09 84 views
2

我有映射數據庫表的POCO類: EDITED ---------------------------- -Linq ConcurrentDictionary角色和用戶多對多

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; 

我使用ORMLite從ServiceStack(這是一些非實體框架精簡版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

+1

不喜歡它。如果一個lambda語句跨越兩行以上,您可能希望將其重構爲它自己的方法 –

+0

我可能會丟失一些東西,但ConcurrentDictionary需要2個T沒有?它不應該是ConcurrentDictionary 也許你想角色中的用戶成爲一個列表?和角色在用戶以及?在這種情況下,linq可能更容易 – Dmitry

+0

@Dmitry,對不起,我不夠清楚。我們有UsersDict ,RolesDict 和RoleUserDict 其中T1字符串是Id,T2是實際對象。 – Tom

回答

1

對於我最好在中間表環的連接,並使用dicationary查找到訪問用戶和角色。

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