【问题标题】:Deserialize Dapper Query into Model将 Dapper 查询反序列化为模型
【发布时间】:2019-12-10 23:06:59
【问题描述】:

我有两个模型:

 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 对象。所以我尝试像这样修改返回:

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

但我得到一个错误:

IDBConnection 不包含 QueryAsync 的定义,并且找不到接受“IDBConnection”类型的第一个参数的可访问扩展方法

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

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

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

【问题讨论】:

    标签: c# dapper


    【解决方案1】:

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

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

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

    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

    【讨论】:

    • 我将我的代码更新为上面的内容,它似乎可以工作。但现在我得到了错误:使用多映射 API 时,如果您有除 Id 以外的键(参数“splitOn”),请确保设置 splitOn 参数。
    • @john 您需要在选择语句中包含 RuleId 字段
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多