Blazor Server中调用返回多表的存储过程并转List的最优方法
多结果集查询最优实现方案
你当前的实现方案存在冗余数据、处理逻辑繁琐、性能偏低的问题,结合你已经引入Dapper的前提,推荐直接使用Dapper原生的多结果集查询能力,完全不需要修改存储过程新增标识列,也不需要手动处理DataSet。
方案1:强类型映射(推荐)
Dapper提供的QueryMultiple方法专门用于处理单次数据库请求返回多个结果集的场景,是这类需求的最优解。
步骤1:调整存储过程
删除你额外添加的标识列,直接正常返回多个结果集即可:
CREATE PROCEDURE [你的存储过程名] AS BEGIN -- 按顺序返回你需要的多张表数据 SELECT * FROM table1 SELECT * FROM table2 -- 有更多表继续往下加即可 END
步骤2:C#端查询代码
直接通过QueryMultiple按存储过程返回结果集的顺序读取,Dapper会自动完成实体映射:
using Microsoft.Data.SqlClient; using Dapper; using System.Data; // 你的实体类示例,属性和表字段对应即可 public class Table1Entity { public int Id { get; set; } public string Name { get; set; } // 其他字段对应属性 } public class Table2Entity { public int Id { get; set; } public DateTime CreateTime { get; set; } // 其他字段对应属性 } // 查询逻辑 using var connection = new SqlConnection("你的数据库连接字符串"); connection.Open(); // 调用存储过程 using var multiResult = connection.QueryMultiple("你的存储过程名", commandType: CommandType.StoredProcedure); // 按存储过程返回结果集的顺序依次读取 List<Table1Entity> table1List = multiResult.Read<Table1Entity>().ToList(); List<Table2Entity> table2List = multiResult.Read<Table2Entity>().ToList();
该方案的优势:
- 没有冗余的标识列数据,减少传输和内存损耗
- 不需要手动处理DataSet、列判断、类型转换,代码简洁可维护性高
- Dapper的自动映射性能远高于DataSet手动转列表的实现
方案2:动态类型适配(无实体类场景)
如果你的结果集结构不固定,不需要定义强类型实体,可以结合Newtonsoft.Json处理动态结果:
using var multiResult = connection.QueryMultiple("你的存储过程名", commandType: CommandType.StoredProcedure); // 读取为动态集合后转成JArray处理 var table1Data = JArray.FromObject(multiResult.Read<dynamic>().ToList()); var table2Data = JArray.FromObject(multiResult.Read<dynamic>().ToList());
特殊场景适配
如果你的存储过程返回结果集的顺序不固定,可以在每个结果集的首行返回表名标识,不需要给所有行加冗余列,示例存储过程:
-- 返回第一个结果集的标识 SELECT 'Table1' AS TableName -- 返回第一个结果集数据 SELECT * FROM table1 -- 返回第二个结果集的标识 SELECT 'Table2' AS TableName -- 返回第二个结果集数据 SELECT * FROM table2
C#端读取时先读标识再读数据即可:
using var multiResult = connection.QueryMultiple("你的存储过程名", commandType: CommandType.StoredProcedure); while (!multiResult.IsConsumed) { var tableName = multiResult.ReadFirst<string>(); var data = multiResult.Read<dynamic>().ToList(); // 按表名处理对应数据 }
内容的提问来源于stack exchange,提问作者user13714356
相关产品推荐
相关产品推荐

