如何使用Dapper查询数据并直接获取JSON格式的结果?
- 内容介绍
- 相关推荐
本文共计586个文字,预计阅读时间需要3分钟。
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 AUTO 或 FOR 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 是一个轻量级的 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 AUTO 或 FOR 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 的设计哲学就是专注数据映射,不掺杂序列化逻辑——这样更可控、更易测试、也更符合分层职责。

