如何使用LINQ筛选满足特定条件的数据表?
使用LINQ实现金属数据筛选需求
原始数据
| Metal | value |
|---|---|
| silver | 5 |
| silver_ref | Y |
| gold | 2 |
| gold_ref | N |
| iron | N |
| iron_ref | N |
筛选规则
仅保留满足以下全部条件的主金属(silver、gold、iron)记录:
- 该金属的
value不等于'N' - 对应的
[金属名]_ref记录的value等于'Y'
期望结果
| Id | value |
|---|---|
| silver | 5 |
LINQ实现方案
1. 定义数据模型
首先定义对应数据表的实体类:
public class MetalRecord { public string Metal { get; set; } public string Value { get; set; } }
2. 构造数据源
假设原始数据已加载为List<MetalRecord>类型:
var metalRecords = new List<MetalRecord> { new MetalRecord { Metal = "silver", Value = "5" }, new MetalRecord { Metal = "silver_ref", Value = "Y" }, new MetalRecord { Metal = "gold", Value = "2" }, new MetalRecord { Metal = "gold_ref", Value = "N" }, new MetalRecord { Metal = "iron", Value = "N" }, new MetalRecord { Metal = "iron_ref", Value = "N" } };
3. 筛选实现
方式一:先筛选主金属再匹配关联记录
逻辑直观,适合数据量较小的场景:
// 提取所有不带_ref后缀的主金属记录 var mainMetals = metalRecords.Where(r => !r.Metal.EndsWith("_ref")); // 筛选符合条件的记录 var filteredResult = mainMetals.Where(m => m.Value != "N" && metalRecords.Any(r => r.Metal == $"{m.Metal}_ref" && r.Value == "Y") ).ToList();
方式二:使用Join关联主金属与参考记录
性能更优,避免多次遍历数据源,适合数据量大的场景:
var filteredResult = from main in metalRecords.Where(r => !r.Metal.EndsWith("_ref")) join reference in metalRecords on $"{main.Metal}_ref" equals reference.Metal where main.Value != "N" && reference.Value == "Y" select main;
执行上述代码后,filteredResult中将仅包含符合条件的silver记录。
内容的提问来源于stack exchange,提问作者Biswa
相关产品推荐
相关产品推荐

