C#中如何使用Dapper的多结果集功能?示例是什么?

来源:网站建设作者:上海GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#中如何使用Dapper的多结果集功能?示例是什么?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#中如何使用Dapper的多结果集功能?示例是什么?》有用,将其分享出去将是对创作者最好的鼓励。

在C#的ORM工具中,Dapper以轻量、高效的特点被广泛使用,其多结果集功能支持在一次数据库查询中返回多个结果集,避免多次发起数据库请求,适合需要同时获取多张关联表数据的场景。

C#中如何使用Dapper的多结果集功能?示例是什么?

Dapper多结果集的核心原理

Dapper的QueryMultiple方法用于执行返回多个结果集的SQL语句,该方法会返回一个SqlMapper.GridReader对象,通过这个对象可以依次读取每个结果集的内容,每个结果集可以映射到不同的实体类型。

使用前的准备工作

首先需要安装Dapper的NuGet包,在项目中通过包管理器控制台执行以下命令:

Install-Package Dapper

假设我们有两张关联的数据库表,结构如下:

用户表(Users)订单表(Orders)
Id int 主键Id int 主键
UserName nvarchar(50)UserId int 外键
Age intOrderNo nvarchar(50)
CreateTime datetimeTotalAmount decimal

对应的C#实体类定义如下:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public int Age { get; set; }
    public DateTime CreateTime { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string OrderNo { get; set; }
    public decimal TotalAmount { get; set; }
}

多结果集功能完整示例

1. 基础多结果集查询示例

下面的示例演示了一次查询同时获取所有用户和所有订单的两个结果集:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;

class Program
{
    static void Main()
    {
        // 数据库连接字符串,实际使用时替换为自己的数据库地址
        string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
        
        using (var connection = new SqlConnection(connectionString))
        {
            // 打开数据库连接
            connection.Open();
            
            // 执行返回多结果集的SQL语句,这里用分号分隔两个查询
            string sql = @"
                SELECT Id, UserName, Age, CreateTime FROM Users;
                SELECT Id, UserId, OrderNo, TotalAmount FROM Orders;
            ";
            
            // 调用QueryMultiple方法获取GridReader对象
            using (var gridReader = connection.QueryMultiple(sql))
            {
                // 读取第一个结果集,映射到User集合
                IEnumerable<User> userList = gridReader.Read<User>();
                // 读取第二个结果集,映射到Order集合
                IEnumerable<Order> orderList = gridReader.Read<Order>();
                
                // 输出用户信息
                Console.WriteLine("用户列表:");
                foreach (var user in userList)
                {
                    Console.WriteLine($"Id:{user.Id}, 用户名:{user.UserName}, 年龄:{user.Age}");
                }
                
                // 输出订单信息
                Console.WriteLine("n订单列表:");
                foreach (var order in orderList)
                {
                    Console.WriteLine($"Id:{order.Id}, 用户Id:{order.UserId}, 订单号:{order.OrderNo}, 总金额:{order.TotalAmount}");
                }
            }
        }
    }
}

2. 带参数的多结果集查询示例

如果需要根据条件查询多结果集,可以在SQL中添加参数,示例如下:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;

class Program
{
    static void Main()
    {
        string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
        int targetUserId = 1;
        
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            // 带参数的多结果集查询SQL,查询指定用户的信息和其对应的订单
            string sql = @"
                SELECT Id, UserName, Age, CreateTime FROM Users WHERE Id = @UserId;
                SELECT Id, UserId, OrderNo, TotalAmount FROM Orders WHERE UserId = @UserId;
            ";
            
            // 传入参数执行查询
            using (var gridReader = connection.QueryMultiple(sql, new { UserId = targetUserId }))
            {
                // 读取第一个结果集,这里只查询单个用户,用ReadFirstOrDefault
                User targetUser = gridReader.ReadFirstOrDefault<User>();
                // 读取第二个结果集,查询该用户的所有订单
                IEnumerable<Order> userOrders = gridReader.Read<Order>();
                
                if (targetUser != null)
                {
                    Console.WriteLine($"查询到的用户:{targetUser.UserName}");
                    Console.WriteLine("该用户的订单:");
                    foreach (var order in userOrders)
                    {
                        Console.WriteLine($"订单号:{order.OrderNo}, 总金额:{order.TotalAmount}");
                    }
                }
                else
                {
                    Console.WriteLine("未找到指定用户");
                }
            }
        }
    }
}

使用注意事项

  • 调用QueryMultiple后,必须按照SQL中结果集返回的顺序依次调用Read方法,顺序错乱会导致读取到错误的数据或者抛出异常。
  • GridReader对象使用完毕后需要及时释放,建议使用using语句包裹,避免数据库连接占用。
  • 如果某个结果集可能为空,读取时可以使用ReadOrDefault或者ReadFirstOrDefault等方法,避免空引用异常。
  • 多结果集的SQL语句需要数据库支持,比如SQL Server、MySQL等主流数据库都支持用分号分隔多个查询语句返回多结果集。
多结果集功能适合数据关联性强的查询场景,不要滥用,避免单次查询返回过多冗余数据影响性能。

Dapper多结果集C#ORM数据库查询修改时间:2026-07-14 17:15:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。