将 Dapper 查询反序列化为模型

Deserialize Dapper Query into Model

我有两个模型:

 public class RuleValidation
{
    public int RuleId { get; set; }
    public string RuleName { get; set; }
    public int ClientId { get; set; }
    public string ClientName { get; set; }
    public List<RuleException> RuleExcpetions { get; set; }
}

和:

 public class RuleException
{
    public int ExceptionId { get; set; }
    public int RuleId { get; set; }
    public string ExceptionValue { get; set; }
    public string ExcpetionResult { get; set; }
}

我正在使用以下查询加载模型:

 public async Task<RuleValidation> GetRulesByClient(string clientId)
    {
        using (IDbConnection conn = Connection)
        {
            string sQuery = @"SELECT 
                                    Client.Id as 'ClientName',
                                    Client.ClientName, 
                                    Rules.Id,
                                    Rules.RuleName,
                                    Rules.Code, 
                                    RuleException.ExceptionValue, 
                                    RuleException.ExceptionResult
                              FROM 
                                    Rules 
                              LEFT OUTER JOIN
                                    RuleException ON Rules.Id = RuleException.RuleId 
                              RIGHT OUTER JOIN
                                    Client ON Rules.Id = Client.RuleId
                              WHERE
                                    Client.ClientName = @CLIENTID";
            conn.Open();
            var result = await conn.QueryAsync<RuleValidation>(sQuery, new { CLIENTID = clientId });
            return (RuleValidation)result;
        }
    }

这似乎将查询反序列化为 RuleValidation 对象,但 RuleException 对象不会为那些有异常的记录加载。所以我试着修改 return 这样的:

 var return= conn.QueryAsync<RuleValidation, RuleException>(
                sQuery,
                (ruleValidation, ruleException) =>
                {
                    ruleValidion.RuleException = ruleException;
                    return return;
                },
                splitOn: "RuleId");

但是我得到一个错误:

IDBCOnnection does not contain a definition for QueryAsync and no accessible extension method accepting a first argument of type 'IDBConnection' could not be found

这是我设置连接的方式(它确实适用于初始查询)

 public IDbConnection Connection
    {
        get
        {
            return new SqlConnection(_configuration.GetConnectionString("ValidationRulesConnectionString"));
        }
    }

我是 dapper 的新手,使用它没有问题,但这是我遇到的第一个问题,我似乎无法在 dapper 教程或在线查找中找到解决方案。

QueryAsync 调用缺少 return 类型。它需要 3 个参数 - 要映射的两个对象,然后是 return 类型。您还需要将例外添加到列表中:

var return= conn.QueryAsync<RuleValidation, RuleException, RuleValidation>(
            sQuery,
            (ruleValidation, ruleException) =>
            {
                if(ruleException != null)
                {
                    ruleValidation.RuleExceptions.Add(ruleException);
                }

                return ruleValidation;
            },
            splitOn: "RuleId");

并确保您的 RuleValidation class 初始化列表 属性

public class RuleValidation
{
    public int RuleId { get; set; }
    public string RuleName { get; set; }
    public int ClientId { get; set; }
    public string ClientName { get; set; }
    public List<RuleException> RuleExcpetions { get; set; } = new List<RuleException>();
}

有个例子here