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 を使用しているため (エンティティ フレームワーク以外のライト 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