Insight.Database调用存储过程报错FastExpando不存在Set1定义
问题解决方法
核心错误原因
你混淆了结果集和输出参数的访问路径:Set1存储查询返回的结果集数据,属于QueryResults<T>返回的顶层结果对象,不属于Outputs属性。Outputs仅用于存储存储过程的输出参数、RETURN返回值,不会包含查询返回的结果集。
代码修正
将Set1的访问路径从x.Outputs.Set1改为直接从返回结果对象访问即可:
var x = _sqlConn.Connection().QueryResults<Results>("MyDb.dbo.get_records", new { id = theId }); int retVal = x.Outputs.Return_Value; if (retVal == 0) // 表示结果集已正常返回,代码运行到此处无异常 { var list = x.Set1; // 修改访问路径即可解决报错 var temp = list.FirstOrDefault(); }
其他排查方向
如果修改后仍有报错,可按以下顺序排查:
- 确认自定义
Results类的定义符合要求:必须包含公开的Set1属性,属性类型和结果集返回的实体列表类型匹配,示例定义如下:
public class Results { // 替换Record为你实际的结果集实体类型 public IList<Record> Set1 { get; set; } }
- 不想自定义结果类可以直接使用多泛型参数的重载,写法如下:
// 第一个泛型参数对应第一个结果集Set1的元素类型,多个结果集依次追加泛型参数即可 var x = _sqlConn.Connection().QueryResults<Record>("MyDb.dbo.get_records", new { id = theId }); int retVal = x.Outputs.Return_Value; if (retVal == 0) { var list = x.Set1; }
- 若还是出现FastExpando相关报错,可将返回对象转为字典排查实际包含的属性:
// FastExpando实现了IDictionary接口,可以直接遍历所有属性名确认返回内容 var resultDict = x as IDictionary<string, object>; foreach (var propName in resultDict.Keys) { // 输出所有属性名,确认是否存在你需要的结果集属性 Debug.WriteLine(propName); }
内容的提问来源于stack exchange,提问作者user3511585
相关产品推荐
相关产品推荐

