C# 泛型方法如何从List<T>集合筛选返回单条匹配记录
泛型Selectus方法单条数据查询修复方案
原有代码问题说明
- 筛选逻辑错误:你当前写的
where prop[1].Name == looking_for,本质是拿**属性的名称字符串(固定为"SapIndex")**和入参looking_for做比对,根本没有读取实体对象上该属性存储的实际业务值,完全无法命中目标记录。 - 资源释放风险:数据库连接没有做异常场景下的自动释放,一旦查询过程中报错,会出现数据库连接泄漏。
- 性能缺陷:先把整张表的所有数据全部加载到内存再做筛选,表数据量变大后内存占用、查询耗时都会急剧升高。
可直接运行的修复代码
版本1:兼容原有逻辑的内存筛选版
适配所有带SapIndex属性的表实体,不需要为每个表单独写查询逻辑:
public static List<T> Selectus<T>(string looking_for) { // using语法会在代码执行完/报错时自动释放数据库连接 using var db = OrmLiteBaza().Open(); var allRecords = db.Select<T>(); // 优先按属性名获取SapIndex字段,比固定取索引1更稳妥,不会因为实体字段顺序调整出错 var targetProperty = typeof(T).GetProperty("SapIndex") ?? typeof(T).GetProperties()[1]; // 逐行读取属性值和入参比对 var result = allRecords .Where(record => targetProperty.GetValue(record)?.ToString() == looking_for) .ToList(); return result; }
版本2:数据库层面筛选的性能优化版
不需要加载全表数据,直接把筛选条件传给数据库执行,性能远高于内存筛选,适合数据量较大的场景:
public static List<T> Selectus<T>(string looking_for) { using var db = OrmLiteBaza().Open(); // 动态构造查询条件,直接在数据库侧完成SapIndex字段的匹配 var query = db.From<T>().Where("SapIndex = @lookingVal", new { lookingVal = looking_for }); return db.Select(query); }
使用注意事项
- 如果你要返回单条数据而非List集合,直接在返回结果前调用
.FirstOrDefault()即可,无匹配记录时返回null,有多条匹配时返回第一条。 - 不建议长期依赖属性固定位置(prop[1])取字段,只要后续实体类调整属性定义顺序,查询就会取错字段,按属性名获取的方式鲁棒性更高。
- 如果
looking_for需要做模糊匹配,只需要把SQL条件里的=改成LIKE,参数值前后加%即可。
内容的提问来源于stack exchange,提问作者Sławomir Sitek
相关产品推荐
相关产品推荐

