具有2个模型的Dapper SQL查询

时间:2018-11-26 11:15:47

标签: c# asp.net-web-api .net-core dapper

我正在开发一个Web api,使用Dapper处理我的SQL调用。首先,我有以下两种模型:

模型1-该模型还具有一个以“模型2”形式关联的子模型

public int COBID { get; set; }
public string ReportingPoint { get; set; }
public string Issuer { get; set; }
public string Group { get; set; }
public string ACCode { get; set; }
public string SourceSystemTradeID { get; set; }
public char SWWR { get; set; }
public string Error { get; set; }
public Model 2 TradeComment { get; set; } 

模型2

public int TradeCommentId { get; set; }
public string SourceSystemTradeID { get; set; }
public string SanctionerComment { get; set; }
public string SignOffBy { get; set; }
public bool CompletedFlag { get; set; }
public bool PreApprovedFlag { get; set; }
public bool GenuineWWRFlag { get; set; }
public DateTime CreatedDate { get; set; }
public string CreatedBy { get; set; } 

对于我的Update功能,我有一个PROC,可以从多个表中提取我需要的所有字段。由于一些问题,我无法显示此过程。但是,此proc的功能很好,因为它已经使用了很长时间了。我正在构建的内容将位于其之上。

最后,对于我的dapper调用,我有以下方法:

public IEnumerable<TradeDetail> GetRecordDetail(string id)
{
    using (var dbConnection = Connection)
    {
        dbConnection.Open();
         return dbConnection.Query<TradeDetail, TradeComment, TradeDetail>("wwr.pMyProc",
            (detail, comment) =>
            {
                 detail.SourceSystemTradeID = id;
                return detail;
             }, splitOn: "TradeCommentId", commandType: CommandType.StoredProcedure);

    }
}

此方法由我的API调用,如下所示:

[HttpPut]
public IActionResult Put(string key, string values)
{
    var record = _wwrRepository.GetRecordDetail(key);
    JsonConvert.PopulateObject(values, record);

    if (!TryValidateModel(record))
    {
        return BadRequest(ModelState.GetFullErrorMessage());
    }
    return Ok(record);
}

当我测试我的代码时,它告诉我一个ID值是必须的,并且必须将其传递给我。我以为我已经在下面的行中这样做了:

detail.SourceSystemTradeID = id;

从我的API收集我的ID并将其传递给此方法的地方。

有人可以帮助我正确设置我的代码调用格式吗?

1 个答案:

答案 0 :(得分:1)

期望您的PROC是ID,而不是模型中的字段。您需要通过

dbConnection.Open();
return dbConnection.Query<TradeDetail, TradeComment, TradeDetail>("wwr.pMyProc",
        (detail, comment) =>
        {
            detail.TradeComment = comment;
            return detail;
        }, 
        splitOn: "TradeCommentId", 
        param: new {id = id }, 
        commandType: CommandType.StoredProcedure);

 }

新{id = id} 中匿名 id 的确切名称取决于您存储的proc期望的实际参数名称,还请注意,您需要分配lambda表达式中收到的comment参数发送到TradeDetail实例中的TradeComment字段