如何用ID和ID_SCH匹配双Records列表并实现关联字段查询?
需求说明
现有两个Records类型的列表firstList与secondList,原本仅通过ID实现两列表匹配,现在需要改为同时使用ID和ID_SCH完成以下操作:
- 遍历
firstList,通过ID和ID_SCH判断项是否存在于secondList中; - 若存在,获取该对应项的
BSID和BSID_SCH字段值; - 用获取到的
BSID和BSID_SCH值,检查其是否存在于firstList中; - 若存在,获取
firstList中对应项的ID和ID_SCH值。
现有代码片段
string getRecords = "SELECT ....."; List<Records> firstList = ReadAll(getRecords, reader => { return new Records( reader.ReadByName(NameRecord.ID, string.Empty), reader.ReadByName(NameRecord.ID_SCH, string.Empty) ); }); string getAllRecords = "SELECT ....."; List<Records> secondList = ReadAll(getAllRecords, reader => { return new Records( reader.ReadByName(NameRecord.ID, string.Empty), reader.ReadByName(NameRecord.ID_SCH, string.Empty), reader.ReadByName(NameRecord.BSID, string.Empty), reader.ReadByName(NameRecord.BSID_SCH, string.Empty), ); }); // 目前仅能通过ID匹配,希望改为同时用ID和ID_SCH,然后获取BSID和BSID_SCH的值 var aa= data.Select(l1 => l1.Id).Intersect(secondList.Select(l2 => l2.Id)).ToList();
解决方案
要实现双字段(ID+ID_SCH)匹配,核心是基于两个字段的组合做关联判断,以下是具体实现:
方式1:使用元组实现匹配(无需修改Records类)
元组默认支持值相等比较,适合快速实现双字段匹配逻辑:
// 1. 从firstList中找出在secondList中存在的项,提取对应的BSID和BSID_SCH var matchedBsRecords = firstList .Join(secondList, first => (first.ID, first.ID_SCH), second => (second.ID, second.ID_SCH), (_, second) => new { second.BSID, second.BSID_SCH }) .ToList(); // 2. 用BSID+BSID_SCH在firstList中匹配,获取对应的ID和ID_SCH var finalResult = matchedBsRecords .Join(firstList, bs => (bs.BSID, bs.BSID_SCH), first => (first.ID, first.ID_SCH), (_, first) => new { first.ID, first.ID_SCH }) .Distinct() // 避免重复结果 .ToList();
方式2:重写Records的相等判断方法(长期维护更友好)
如果需要多次基于ID+ID_SCH做匹配,可以在Records类中重写相等判断逻辑,让系统默认识别双字段匹配规则:
public class Records { // 原有字段定义 public string ID { get; set; } public string ID_SCH { get; set; } public string BSID { get; set; } public string BSID_SCH { get; set; } // 重写Equals方法 public override bool Equals(object obj) { if (obj is Records other) { return ID == other.ID && ID_SCH == other.ID_SCH; } return false; } // 重写GetHashCode方法,保证相等对象的哈希值一致 public override int GetHashCode() { return HashCode.Combine(ID, ID_SCH); } }
之后可以用更简洁的方式实现逻辑:
// 找出firstList和secondList的交集(基于ID+ID_SCH) var commonRecords = firstList.Intersect(secondList).ToList(); // 提取BSID和BSID_SCH,再在firstList中匹配 var finalResult = commonRecords .Select(r => new { r.BSID, r.BSID_SCH }) .Join(firstList, bs => (bs.BSID, bs.BSID_SCH), first => (first.ID, first.ID_SCH), (_, first) => new { first.ID, first.ID_SCH }) .Distinct() .ToList();
逻辑说明
- 第一次关联:通过
ID+ID_SCH的组合键,筛选出同时存在于两个列表的项,提取所需的BSID和BSID_SCH; - 第二次关联:用
BSID+BSID_SCH作为新的组合键,再次在firstList中匹配,获取最终需要的ID和ID_SCH; Distinct():用于过滤可能出现的重复匹配结果,根据实际业务场景选择是否保留。
内容的提问来源于stack exchange,提问作者learn coding
相关产品推荐
相关产品推荐

