You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:24:23