我正在尝试基于此类过滤列表-结果应该是包含所有符合搜索条件的会话的计算机的列表,但仅限那些会话。
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进行此操作-我确定有,但找不到。
任何建议/指针将不胜感激。
答案 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();