You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:24:03