LINQ嵌套DTO查询求助:根据姓名批量获取DOB
批量获取指定姓名对应的DOB值(LINQ实现)
数据结构示例
先明确你的嵌套数据结构对应的实体类定义:
// DTOData列表中的单个项 public class DTODataItem { public List<Table> Tables { get; set; } } // 嵌套的Table类 public class Table { public string Name { get; set; } public DateTime DOB { get; set; } }
LINQ实现方案
假设你有:
List<DTODataItem> dtoData:源数据列表List<string> targetNames:需要匹配的目标姓名列表
方案1:获取所有匹配的DOB(含重复项)
如果同一个姓名在多个Table中出现,会返回所有对应的DOB值:
var matchedDobs = dtoData // 展开所有嵌套的Tables集合 .SelectMany(item => item.Tables) // 筛选姓名在目标列表中的项 .Where(table => targetNames.Contains(table.Name)) // 提取DOB字段 .Select(table => table.DOB) .ToList();
方案2:按姓名去重,保留每个姓名的首个DOB
若要避免重复,确保每个姓名仅返回一个DOB(取首次匹配的结果):
var uniqueDobs = dtoData .SelectMany(item => item.Tables) .Where(table => targetNames.Contains(table.Name)) // 按姓名分组,取每组第一个项的DOB .GroupBy(table => table.Name) .Select(group => group.First().DOB) .ToList();
方案3:返回姓名与DOB的键值对(保留对应关系)
如果需要明确姓名和DOB的对应关系,可返回字典结构:
var nameDobMap = dtoData .SelectMany(item => item.Tables) .Where(table => targetNames.Contains(table.Name)) .GroupBy(table => table.Name) // 每个姓名对应首个匹配的DOB .ToDictionary(group => group.Key, group => group.First().DOB);
优化提示
如果目标姓名列表targetNames数据量较大,建议先转为HashSet<string>提升查询效率:
var nameHashSet = new HashSet<string>(targetNames); // 后续Where条件替换为:.Where(table => nameHashSet.Contains(table.Name))
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

