c#从方法中删除SQL并使用存储过程&衣冠楚楚的
本文关键字:存储过程 衣冠楚楚 方法 删除 SQL | 更新日期: 2023-09-27 18:14:11
我正试图将一个方法转换为使用Dapper的存储过程。但是我对var result =...
的情况很困惑
public Task<TUser> FindByIdAsync(Guid userId)
{
var sql = @"SELECT *
FROM IdentityUser
WHERE UserId = @USERID";
using (var connection = new SqlConnection(_connection))
{
var result = connection.Query<TUser, IdentityProfile, TUser>(sql, (user, profile) => { user.Profile = profile;
return user; },
new { userId }, splitOn: "UserId").SingleOrDefault();
return Task.FromResult(result);
}
}
我有:
public Task<TUser> FindByIdAsync(Guid userId)
{
using (var connection = new SqlConnection(_connection))
{
var param = new DynamicParameters();
param.Add("@UserId", userId);
return Task.FromResult(connection.Query("IdentityGetUserById", param, commandType: CommandType.StoredProcedure).SingleOrDefault());
}
}
但是我很困惑var result =…
不要混淆这是简单的 apper功能
让我解释一下下面代码的作用:
var result = connection.Query<TUser, IdentityProfile, TUser>
(sql, (user, profile) =>
{
user.Profile = profile;
return user;
}, new { userId },
splitOn: "UserId").SingleOrDefault();
- 用户是一个复杂类型,其中包含Profile类型的一部分
- 执行Sql查询的结果是一个组合的表格数据(列分别为User和Profile),它在列
UserId
处自动分割,然后它表示Profile类型,填充在User类型中,按照逻辑user.Profile = profile
- 由于查询结果为
IEnumerable<TUser>
,因此调用SingleOrDefault
,如果返回Single record
则返回数据或返回null
这是自动绑定
complex types
的标准机制。现在,当你运行存储过程IdentityGetUserById
时,同样的代码是预期的,唯一的变化是用存储过程名称(done)代替真实的Sql,告诉Dapper你正在执行存储过程(done),你已经使用DynamicParameter
绑定了参数,也可以是匿名类型。结果将以类似的格式显示,您可以执行完全相同的绑定,检查以下代码,只需进行少量修改:
using (var connection = new SqlConnection(_connection))
{
var result = connection.Query<TUser, IdentityProfile, TUser>
("IdentityGetUserById",
commandType: CommandType.StoredProcedure,
(user, profile) =>
{
user.Profile = profile;
return user;
}, new { userId },
splitOn: "UserId").SingleOrDefault();
return Task.FromResult(result);
);
}
事实上,我已经删除了Dynamic Parameters
并使用Anonymous type
来确保它与Sql代码