0

私は次の構造を手に入れました:

 One user can have many Groups and a Group can have many users.

ここで、ユーザーのように同じグループに属するすべてのユーザーにフィルターをかけてもらいたいと思います。

たとえば、ユーザー「Theo」はグループ1と2に属しています。グループ1またはグループ2に属するすべてのユーザーが必要です。

LINQまたは一般的にc#でこれを達成するにはどうすればよいですか?

このコードは機能しません:

var res = (IEnumerable<User>)Users;
foreach (var item in user.Groups) {
    res = res.Where(usr => usr.Groups.Contains(item));
}
return res.ToList();

Usersは別のメソッドから取得したリストでありuser、タイプのパラメータですUser

4

2 に答える 2

2

私が想定し:

  • UserクラスにはGroupsタイプのプロパティがありますList<Group>
  • GroupクラスにはUsersタイプのプロパティがありますList<User>

LINQSelectManyメソッドを使用します。

var usersInSameGroups = user.Groups.SelectMany(group => group.Users).ToList();

またはクエリ構文:

var usersInSameGroups = (from g in user.Groups
                         from userInGroup in g.Users
                         select userInGroup).ToList();

アップデート

return (from user2 in Users
        where user2.Groups.Intersect(user.Groups).Any()  // Keeps only user2 if it has a common group with user
        select user2).ToList();
于 2013-02-03T13:41:33.173 に答える
0

おそらくグループで使用Intersect.Anyします:

var groupsFind = new []{"Group1","Group2"};
var userFound = allUsers
    .Where(u => u.Groups
                 .Select(ug => ug.Name)
                 .Intersect(groupsFind)
                 .Any());

モデルがわかりません。ユーザーはn個のグループに属しており、すべてのグループにn個のユーザーを含めることができます。最後の関係は冗長ではありませんか、それとも最初の関係と同じではありませんか?その逆ですか?

于 2013-02-03T13:56:24.053 に答える