如何使用Dapper查询数据并直接获取JSON格式的结果?

2026-05-07 21:541阅读0评论SEO教程
  • 内容介绍
  • 相关推荐

本文共计586个文字,预计阅读时间需要3分钟。

如何使用Dapper查询数据并直接获取JSON格式的结果?

Dapper 是一个轻量级的 ORM 框架,它不直接返回 JSON 字符串,而是将数据库结果映射为 .NET 对象,例如 List。

1. 先用 Dapper 查询数据,再序列化为 JSON

这是最常用、最清晰的做法。Dapper 负责“取数据”,JSON 库负责“转格式”。

  • 使用 Query<T>() 获取对象列表或单个对象
  • JsonSerializer.Serialize()(.NET Core 3.0+)转成字符串
  • 注意:确保实体类属性是 public,且有 getter,否则序列化可能为空

示例(ASP.NET Core Web API 中常见写法):

// 定义模型 public class User { public int Id { get; set; } public string Name { get; set; } } <p>// Dapper 查询 + JSON 序列化 using var conn = new SqlConnection(connectionString); var users = conn.Query<User>("SELECT Id, Name FROM Users WHERE Age > @age", new { age = 18 }); string json = JsonSerializer.Serialize(users); // → [{"Id":1,"Name":"张三"}, ...]

2. 不推荐:在 SQL 中拼 JSON(如 FOR JSON)

SQL Server 2016+ 支持 FOR JSON AUTOFOR JSON PATH,可让数据库直接返回 JSON 字符串:

  • 执行后得到的是 string 类型结果,不是对象,Dapper 只需 QuerySingle<string>()
  • 优点:减少网络传输对象数量,适合简单场景
  • 缺点:失去类型安全、难调试、无法复用实体逻辑、跨数据库不兼容

示例:

string json = conn.QuerySingle<string>(@" SELECT Id, Name FROM Users WHERE Id = @id FOR JSON PATH, WITHOUT_ARRAY_WRAPPER", new { id = 1 }); // → {"Id":1,"Name":"张三"}

3. 封装成通用方法(可选)

如果项目中频繁需要“查完立刻转 JSON”,可以封装一个扩展方法:

public static class DapperJsonExtensions { public static string QueryAsJson<T>(this IDbConnection conn, string sql, object param = null) { var result = conn.Query<T>(sql, param); return JsonSerializer.Serialize(result); } } // 使用:string json = conn.QueryAsJson<User>("SELECT * FROM Users");

基本上就这些。Dapper 的设计哲学就是专注数据映射,不掺杂序列化逻辑——这样更可控、更易测试、也更符合分层职责。

本文共计586个文字,预计阅读时间需要3分钟。

如何使用Dapper查询数据并直接获取JSON格式的结果?

Dapper 是一个轻量级的 ORM 框架,它不直接返回 JSON 字符串,而是将数据库结果映射为 .NET 对象,例如 List。

1. 先用 Dapper 查询数据,再序列化为 JSON

这是最常用、最清晰的做法。Dapper 负责“取数据”,JSON 库负责“转格式”。

  • 使用 Query<T>() 获取对象列表或单个对象
  • JsonSerializer.Serialize()(.NET Core 3.0+)转成字符串
  • 注意:确保实体类属性是 public,且有 getter,否则序列化可能为空

示例(ASP.NET Core Web API 中常见写法):

// 定义模型 public class User { public int Id { get; set; } public string Name { get; set; } } <p>// Dapper 查询 + JSON 序列化 using var conn = new SqlConnection(connectionString); var users = conn.Query<User>("SELECT Id, Name FROM Users WHERE Age > @age", new { age = 18 }); string json = JsonSerializer.Serialize(users); // → [{"Id":1,"Name":"张三"}, ...]

2. 不推荐:在 SQL 中拼 JSON(如 FOR JSON)

SQL Server 2016+ 支持 FOR JSON AUTOFOR JSON PATH,可让数据库直接返回 JSON 字符串:

  • 执行后得到的是 string 类型结果,不是对象,Dapper 只需 QuerySingle<string>()
  • 优点:减少网络传输对象数量,适合简单场景
  • 缺点:失去类型安全、难调试、无法复用实体逻辑、跨数据库不兼容

示例:

string json = conn.QuerySingle<string>(@" SELECT Id, Name FROM Users WHERE Id = @id FOR JSON PATH, WITHOUT_ARRAY_WRAPPER", new { id = 1 }); // → {"Id":1,"Name":"张三"}

3. 封装成通用方法(可选)

如果项目中频繁需要“查完立刻转 JSON”,可以封装一个扩展方法:

public static class DapperJsonExtensions { public static string QueryAsJson<T>(this IDbConnection conn, string sql, object param = null) { var result = conn.Query<T>(sql, param); return JsonSerializer.Serialize(result); } } // 使用:string json = conn.QueryAsJson<User>("SELECT * FROM Users");

基本上就这些。Dapper 的设计哲学就是专注数据映射,不掺杂序列化逻辑——这样更可控、更易测试、也更符合分层职责。