C#中如何对List<LookUP>集合编写等效SQL的LINQ查询
LINQ实现内存查找表等效SQL筛选方案
你需要的与SQL逻辑完全对齐的LINQ筛选实现如下:
基础直接查询写法
和SQL的WHERE条件逻辑一一对应,直接对内存集合调用Where方法做双字段匹配即可:
- 对应查询LDAP下State列值的SQL:
// 等效SQL: select * from tablename where lookupschema='LDAP' and LookUpColumn ='State' var stateLookups = lookuplist .Where(item => item.LookUpSchema == "LDAP" && item.LookUpColumn == "State") .ToList(); // 如果只需要返回查找值集合,追加Select投影即可 List<string> stateValues = stateLookups.Select(item => item.LookUpValue).ToList(); // 执行结果: ["TN", "MH", "DL"]
- 对应查询LDAP下LANGUAGE列值的SQL:
// 等效SQL: select * from tablename where lookupschema='LDAP' and LookUpColumn ='LANGUAGE' var languageLookups = lookuplist .Where(item => item.LookUpSchema == "LDAP" && item.LookUpColumn == "LANGUAGE") .ToList(); List<string> languageValues = languageLookups.Select(item => item.LookUpValue).ToList(); // 执行结果: ["EN", "FR"]
注意事项
- 字符串大小写兼容:你给出的集合初始化示例中
LookUpColumn赋值为全大写"STATE",但数据库示例值为"State",如果业务场景下存在字段值大小写不统一的情况,建议使用忽略大小写的比较逻辑,避免漏查数据:
var stateLookups = lookuplist .Where(item => item.LookUpSchema.Equals("LDAP", StringComparison.OrdinalIgnoreCase) && item.LookUpColumn.Equals("State", StringComparison.OrdinalIgnoreCase) ) .ToList();
- 高频查询性能优化:如果该查找表的查询频次很高,每次全量遍历List的性能会随数据量上升下降,建议首次加载数据时直接构建内存索引,和数据库索引的查询效率一致:
// 系统启动拉取全量数据后,一次性构建二级字典索引 // 一级Key: LookUpSchema,二级Key: LookUpColumn,值为对应查找记录集合 var lookupMemoryIndex = lookuplist .GroupBy(x => x.LookUpSchema) .ToDictionary( schemaGroup => schemaGroup.Key, schemaGroup => schemaGroup .GroupBy(x => x.LookUpColumn) .ToDictionary(colGroup => colGroup.Key, colGroup => colGroup.ToList()) ); // 后续查询直接按键取数据,无需遍历全集合 if (lookupMemoryIndex.TryGetValue("LDAP", out var columnMap) && columnMap.TryGetValue("State", out var targetRecords)) { List<string> stateValues = targetRecords.Select(x => x.LookUpValue).ToList(); }
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

