Linq - фильтр внутреннего списка - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь отфильтровать список на основе этих классов - результатом должен быть список со всеми компьютерами, на которых есть сеансы, которые соответствуют условию поиска, но только с этими сеансами.

class Machine {
    public string collectionName  { get; set; }
    public string machineName  { get; set; }
    public bool status { get; set; }
    public List<Session> sessionList { get; set; }
    }

 class Session {
    public string userId { get; set; }
    public string userName { get; set; }
    public string computerName { get; set; }
    public IPAddress ipAddress { get; set; }
    }

    List<Machine> allMachineData;

    var auxfindResults = (from machine_item in allMachineData
                          from session_item in machine_item.sessionList
                          where (session_item.userId.ToUpperInvariant().Contains(searchTerm.ToUpperInvariant())
                              || session_item.userName.ToUpperInvariant().Contains(searchTerm.ToUpperInvariant()))
                          select machine_item).ToList();

Я получаю список всех машин с сеансами, соответствующими условию, но я также получаю результаты, которые мне не нужны, т.е. сеансы, которые не соответствуют условиям.

Если вместо этого я попытаюсь:

var auxfindResults = (from machine_item in allMachineData
                          from session_item in machine_item.sessionList
                          where (session_item.userId.ToUpperInvariant().Contains(searchTerm.ToUpperInvariant())
                              || session_item.userName.ToUpperInvariant().Contains(searchTerm.ToUpperInvariant()))
                          select session_item).ToList();

Я получаю все сеансы, соответствующие условию, но, очевидно, я теряю часть "машина"

У меня есть рабочее решение с использованием циклов, но мне это не нравится.Есть ли способ сделать это с помощью linq - я уверен, что есть, но я не могу найти его.

Любые предложения / указатели будут с благодарностью.

1 Ответ

0 голосов
/ 26 февраля 2019

Вам также необходимо отфильтровать сеансы, включенные в ваш выбор.

Использование синтаксиса метода Linq:

searchTerm = searchTerm.ToLower();
var result = allMachineData
    .Where(m => m.sessionList.Any(s => s.userId.ToLower().Contains(searchTerm) || s.userName.ToLower().Contains(searchTerm)))
    .Select(m => new Machine
    {
        collectionName = m.collectionName,
        machineName = m.machineName,
        status = m.status,
        sessionList = m.sessionList.Where(s => s.userId.ToLower().Contains(searchTerm) || s.userName.ToLower().Contains(searchTerm)).ToList(),
    }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...