Фильтрация результатов по пересечению коллекций?

1

У меня есть объект (Ticket), который имеет связь с другим объектом (WorkflowItem), и он, в свою очередь, имеет набор разрешений (WorkflowItemPermissions). То, что я пытаюсь достичь (без зацикливания на смерть), заключается в том, чтобы дать возможность получить все билеты, чтобы иметь возможность отфильтровывать все билеты на основе пользователя, имеющего определенную роль/роли. Итак, вот какой код:

public class Ticket{
    public WorkflowItem Workflow;
}

public class WorkflowItem{
    public List<WorkflowItemPermission> Permissions;
}

public class WorkflowItemPermission{
    public int RoleID;
}

Хорошо, так что это основной графический объект (прошу простить любые ошибки компилятора, это просто для примера). То, что я пытаюсь достичь, - это вызов, подобный этому

service.All(new List<int>{1,2,3,4,5});

Из приведенных выше фрагментов вы можете увидеть, что я хочу вернуть все билеты, где WorkflowPermission.RoleID находится в списке ролей, переданных в вызов метода. Это то, что у меня есть до сих пор, но оно не работает и не компилируется (как будто это были взаимоисключающие LOL).

public List<Ticket> All(List<int> Roles)
{
    List<Ticket> tickets = _repository.All().Where(c=> Roles.Intersect(c.WorkflowItem.Permissions.Select(a => a.RoleID))).ToList();

    return tickets;
}

Теперь, как правило, вы должны использовать простой контент или тому подобное, чтобы фильтровать (в основном предложение "in"), но это файл между двумя коллекциями ints. Прежде всего, это возможно, а затем, во-вторых, пожалуйста, покажите мне, как это сделать.

Теги:
lambda

3 ответа

0
Лучший ответ

Попробуй это

public List<Ticket> All(List<int> Roles)
{
    List<Ticket> tickets = _repository.All().Where(x => x.Workflow.Permissions.Any(y => Roles.Contains(y.RoleID))).ToList<Ticket>();

    return tickets;
}
0

Попробуй это:

tickets.Where(ti => ti.Workflow.Permissions.Any(p => permissions.Contains(p.RoleID)))

где

var permissions = new List<int>{1,2,3,4,5}

и "билеты" - это IEnumerable<Ticket> который содержит все билеты

0

Я не совсем уверен, в чем проблема. Эта работа для меня абсолютно правильно:

        var a = new List<int> { 1, 2, 3 };
        var b = new List<int> { 3, 4, 5 };

        var c = a.Intersect(b).ToList();
        Console.WriteLine(string.Join(",",c.Select(c1 => c1+"").ToArray()));
        Console.ReadKey();

возвращается: 3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню