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
不喜歡它。如果一個lambda語句跨越兩行以上,您可能希望將其重構爲它自己的方法 –
我可能會丟失一些東西,但ConcurrentDictionary需要2個T沒有?它不應該是ConcurrentDictionary也許你想角色中的用戶成爲一個列表?和角色在用戶以及?在這種情況下,linq可能更容易 –
Dmitry
@Dmitry,對不起,我不夠清楚。我們有UsersDict,RolesDict 和RoleUserDict 其中T1字符串是Id,T2是實際對象。 –
Tom