LINQ содержит точно совпадающие - PullRequest
0 голосов
/ 30 июня 2018

У нас есть следующая структура класса, и мы хотим запросить всех пользователей, у которых есть хотя бы все роли или более, из Queryparameter mustHaveRole. Если у кого-то есть хорошая идея, это было бы круто: -)

public class User
{
    public Guid UserId { get; set; }
    public string Username { get; set; }
    public ICollection<UserRole> Roles { get; set; } = new HashSet<UserRole>();
}

public class UserRole
{
    public virtual User User { get; set; }
    public Guid UserId { get; set; }

    public virtual Role Role { get; set; }
    public Guid RoleId { get; set; }
}

public class Role
{
    public Guid RoleId { get; set; }
    public string RoleName { get; set; }
    public ICollection<User> Users { get; set; } = new HashSet<User>();
}

public class QueryHandler
{
    readonly List<User> Users = new List<User>();

    public IEnumerable<User> Handle(List<Guid> musthaveRoles)
    {
        var queryResult =
            from u in Users
            from r in u.Roles
            where musthaveRoles.Contains(r.RoleId) //ContainsAllExact and not has one of the roles???
            select u;

        return queryResult;
    }
}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я думаю, что вы ищете это:

var queryResult = Users.Where(x => musthaveRoles.All(y => x.Roles.Select(z => z.RoleId).Contains(y)));

// or this way
var queryResult1 = Users.Where(x => !musthaveRoles.Except(x.Roles.Select(y => y.RoleId)).Any());
0 голосов
/ 30 июня 2018

Если вам нужно точное совпадение, вы можете использовать метод SequenceEqual. Чтобы все заработало, вам нужно заказать ids

public IEnumerable<User> Handle(List<Guid> musthaveRoles)
{
    var queryResult = Users.Where(
        u => u.Roles.Select(r => r.RoleId).OrderBy(id => id)
            .SequenceEqual(musthaveRoles.OrderBy(id => id)));

    return queryResult;
}

Этот запрос вернет только тех пользователей, которые имеют те же роли, которые вы ожидаете, и отфильтрует пользователей, у которых больше ролей

<ч /> EDIT:

пользователи с большим количеством ролей должны быть также в queryResult

Вы можете использовать Intersect метод:

public IEnumerable<User> Handle(List<Guid> musthaveRoles)
{
    var queryResult = Users.Where(u => u.Roles.Select(r => r.RoleId)
      .Intersect(musthaveRoles).Count() == musthaveRoles.Count);
    return queryResult;
}

Проверьте демоверсию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...