Dapper 是一个轻量级的 ORM(对象关系映射)框架,用于简化 C# 中的数据库操作。它允许开发者通过简单的对象映射来执行 SQL 查询,并将结果自动映射到 C# 对象中。嵌套对象映射是指将数据库中的多表关联数据映射到一个复杂对象中,这个复杂对象包含多个子对象。
Dapper 支持多种映射方式,包括:
嵌套对象映射常用于以下场景:
假设有两个表:Users
和 Orders
,它们通过 UserId
进行关联。
CREATE TABLE Users (
Id INT PRIMARY KEY,
Name NVARCHAR(100)
);
CREATE TABLE Orders (
Id INT PRIMARY KEY,
UserId INT,
ProductName NVARCHAR(100),
FOREIGN KEY (UserId) REFERENCES Users(Id)
);
对应的 C# 类定义如下:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public int UserId { get; set; }
public string ProductName { get; set; }
}
使用 Dapper 映射嵌套对象的代码如下:
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;
public class UserRepository
{
private readonly string _connectionString;
public UserRepository(string connectionString)
{
_connectionString = connectionString;
}
public User GetUserWithOrders(int userId)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var query = @"
SELECT u.Id, u.Name, o.Id AS OrderId, o.ProductName
FROM Users u
LEFT JOIN Orders o ON u.Id = o.UserId
WHERE u.Id = @UserId";
return connection.Query<User, Order, User>(query, (user, order) =>
{
user.Orders ??= new List<Order>();
user.Orders.Add(order);
return user;
}, splitOn: "OrderId", param: new { UserId = userId }).FirstOrDefault();
}
}
}
原因:
splitOn
参数用于指定在哪个字段处分割结果集,以便正确映射嵌套对象。解决方法:
splitOn
参数设置正确,通常设置为关联字段的下一个字段。??= new List<Order>()
。通过以上步骤,可以有效地使用 Dapper 进行嵌套对象映射,并解决常见的问题。
领取专属 10元无门槛券
手把手带您无忧上云