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());
    }
}

c#从方法中删除SQL并使用存储过程&衣冠楚楚的

但是我很困惑var result =…

不要混淆这是简单的 apper功能

让我解释一下下面代码的作用:

var result = connection.Query<TUser, IdentityProfile, TUser>
                        (sql, (user, profile) => 
                        { 
                             user.Profile = profile;
                             return user; 
                        }, new { userId }, 
                       splitOn: "UserId").SingleOrDefault();
  1. 用户是一个复杂类型,其中包含Profile类型的一部分
  2. 执行Sql查询的结果是一个组合的表格数据(列分别为User和Profile),它在列UserId处自动分割,然后它表示Profile类型,填充在User类型中,按照逻辑user.Profile = profile
  3. 由于查询结果为IEnumerable<TUser>,因此调用SingleOrDefault,如果返回Single record则返回数据或返回null
  4. 这是自动绑定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代码

一致