Linq-过滤器内部列表

时间:2019-02-26 12:35:42

标签: c# linq filter

我正在尝试基于此类过滤列表-结果应该是包含所有符合搜索条件的会话的计算机的列表,但仅限那些会话。

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 :(得分:0)

您还需要过滤选择中包含的会话。

使用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();