col2/col3 の組み合わせが一意かどうかに応じて、2 つの解決策があります。
class Role
{
public string RoleID { get; set; }
public string Rolecode { get; set; }
public string Rolename { get; set; }
}
IEnumerable<Role> source = ...;
Dictionary<string, Dictionary<string, List<string>>> result = source
.GroupBy(r => r.RoleID)
.ToDictionary(g => g.Key,
g => g.GroupBy(r2 => r2.Rolecode)
.ToDictionary(g2 => g2.Key,
g2 => g2.Select(r3 => r3.Rolename).ToList())
);
// Rolecode unique
Dictionary<string, Dictionary<string, string>> result2 = source
.GroupBy(r => r.RoleID)
.ToDictionary(g => g.Key,
g => g.ToDictionary(r2 => r2.Rolecode, r2 => r2.Rolename)
);
しかし、3 つの列のすべての組み合わせが一意である場合、すべてが無意味になります。ただし、2 つの辞書を作成することは理にかなっています。
Dictionary<string, Role> rolesByID = source.ToDictionary(r => r.RoleID);
Dictionary<string, Role> rolesByCode = source.ToDictionary(r => r.Rolecode);