我有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(它是一些非实体框架精简版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&amp; Lambda专家:D
答案 0 :(得分: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]);
});