查询OrderDetail表金额总和时触发'Column 'Id' does not belong to table'错误
查询OrderDetail表金额总和时触发'Column 'Id' does not belong to table'错误
嗨,这个问题很好排查,咱们一步步拆解来看:
问题根源
当你执行SELECT SUM(Amount) AS Amount FROM OrderDetail这条查询时,数据库返回的结果表只有一个Amount列,但你的代码里依然在尝试从返回的DataRow中读取Id、OrderNo、Name这些字段:
Id = r.Field<int>("Id"), OrderNo = r.Field<int>("OrderNo"), Name = r.Field<string>("Name"),
这些字段根本不存在于当前的查询结果里,自然就会抛出“列Id不属于表”的错误啦。
另外还有个小问题:总和查询的结果只有一行数据,你给它加上OFFSET ... FETCH NEXT ...分页语句完全没必要,反而会让逻辑更混乱。
解决方案
根据你的核心需求(获取金额总和),咱们需要单独处理这个查询场景,不用再映射到包含多余字段的OrderDetail对象里,修改思路如下:
- 简化求和查询逻辑:不需要分页参数,直接执行求和语句即可。
- 单独读取求和结果,跳过对
Id等无关字段的映射。
给你个修改后的代码示例参考:
public object Get() { var queryString = Request.Query; // 求和场景下分页参数无意义,可忽略 string qs = "SELECT SUM(Amount) AS TotalAmount FROM OrderDetail"; DataSet data = CreateCommand(qs, cons); // 直接读取唯一的求和结果 decimal totalAmount = data.Tables[0].Rows[0].Field<decimal>("TotalAmount"); // 统计总数时建议用COUNT(*),原SELECT *会有性能浪费 int count = 0; if (con.State != ConnectionState.Open) con.Open(); using (SqlCommand comm = new SqlCommand("SELECT COUNT(*) FROM dbo.OrderDetail", con)) { count = (Int32)comm.ExecuteScalar(); } con.Close(); // 按需求返回结果格式 return Json(new { TotalAmount = totalAmount, Count = count }); }
如果你的接口需要同时支持普通列表查询和求和查询,建议新增一个区分场景的参数(比如$action=sum或$action=list),然后根据参数分支执行不同的查询和映射逻辑。
备注:内容来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

