将 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
我有两个模型:
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