C#中如何将SQL查询结果转换为数组/字典/数据框?
几种将C#查询结果转为字典/数据框的方案
针对你需要把ADVISORCHEMICALS表中匹配casnumber的记录转为字典、数组或数据框的需求,这里提供几种实用方案:
1. 手动构造字典(类型安全,可控性强)
如果明确知道需要哪些属性,直接手动构造字典,避免反射开销,同时保证类型安全:
// 先获取匹配的实体 var chemical = ADVISORCHEMICALS.FirstOrDefault(cdls => cdls.casnumber == casnumber); if (chemical != null) { var chemDict = new Dictionary<string, object> { ["boiling_point"] = chemical.boiling_point, ["melting_point"] = chemical.melting_point, // 依次添加其他30+属性,例如: // ["density"] = chemical.density, // ["molecular_weight"] = chemical.molecular_weight }; }
2. 反射自动生成字典(自动遍历所有属性)
如果需要自动包含实体的所有属性,不用手动逐个编写,可以用反射实现:
var chemical = ADVISORCHEMICALS.FirstOrDefault(cdls => cdls.casnumber == casnumber); if (chemical != null) { var chemDict = chemical.GetType() .GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) // 可选:过滤掉导航属性或复杂类型属性 .Where(prop => !prop.PropertyType.IsClass || prop.PropertyType == typeof(string)) .ToDictionary(prop => prop.Name, prop => prop.GetValue(chemical)); }
注意:如果实体包含导航属性(关联其他表的对象),建议加上
Where条件过滤,避免把复杂类型存入字典。
3. 使用匿名类型(临时访问更简洁)
如果只是临时需要访问多个属性,匿名类型是最简洁的选择,后续可直接通过属性名访问:
var chemData = (from cdls in ADVISORCHEMICALS where cdls.casnumber == casnumber select new { cdls.boiling_point, cdls.melting_point, // 继续添加其他需要的属性 }).FirstOrDefault(); // 访问示例 if (chemData != null) { var bp = chemData.boiling_point; var mp = chemData.melting_point; }
4. 转为DataTable(数据框形式)
如果需要类似表格的结构化数据(比如用于展示或批量处理),可以转成DataTable:
// 获取匹配的记录列表(单条的话用FirstOrDefault) var chemicals = ADVISORCHEMICALS.Where(cdls => cdls.casnumber == casnumber).ToList(); DataTable dt = new DataTable(); // 自动生成DataTable列 var entityType = typeof(ADVISORCHEMICALS_Entity); // 替换为你的实体类名 foreach (var prop in entityType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { // 处理可空类型 var columnType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; dt.Columns.Add(prop.Name, columnType); } // 填充数据到DataTable foreach (var chem in chemicals) { DataRow row = dt.NewRow(); foreach (var prop in entityType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { row[prop.Name] = prop.GetValue(chem) ?? DBNull.Value; } dt.Rows.Add(row); }
内容的提问来源于stack exchange,提问作者CharlieBitMaFinga
相关产品推荐
相关产品推荐

