首页 > 解决方案 > Dapper 只返回 Null 值

问题描述

我在使用 Dapper 时遇到问题。我有两个模型:

public class ClientEventsModel
{
    public int Id { get; set; }
    public int ClientId { get; set; }
    public ClientEventTypeLog EventType {get; set;}
    public int Value { get; set; }
    public DateTime Date { get; set; }
    public string? Doer { get; set; }
}

[Serializable]
public class ExtentedClientEventsModel : ClientEventsModel
{
    public List<string> Values { get; set; } = new List<string>();

}

一个是从另一个继承而来的。以及以下形式的请求:

var sqlStr = $@"SELECT ce.Id, ce.ClientId, ce.EventType, ce.Value, ce.Date, a.UserName AS Doer, cevn.`Values` FROM clients.client_events ce 
                                    LEFT JOIN `z-price`.aspnetusers a ON ce.Doer = a.Id_num 
                                        LEFT JOIN clients.clients_events_value_name cevn ON ce.Id = cevn.ClientEventsId 
                                where ClientId = {clientId} and Date BETWEEN '{from.ToMysql()}' and '{to.AddDays(1).ToMysql()}'";
                var result = DefaultConnection.Query<ExtentedClientEventsModel>(sqlStr);

当我在客户端执行查询时,它返回 16 条记录。但是当我使用 Dapper 时,它会返回 4 条记录。只有那些具有 Doer == null 字段的人。我尝试用动态类型替换模型,但没有帮助。

标签: mysqlasp.netc.net-coredapper

解决方案


Dapper 无法发明返回的行数。如果 Dapper 说有 4 行,那么是以下两件事之一:

  1. 你找到了 Dapper 多年来未曾见过的小众边缘案例
  2. 您的查询确实只返回 4 行

现在,我对“1”持开放态度,但实际上“2”更有可能。我怀疑这里真正的问题是参数 - 或缺少参数。永远不要使用连接从值构建 SQL。请尝试:

const string sqlStr = @"
SELECT ce.Id, ce.ClientId, ce.EventType, ce.Value, ce.Date, a.UserName AS Doer, cevn.`Values` FROM clients.client_events ce 
LEFT JOIN `z-price`.aspnetusers a ON ce.Doer = a.Id_num 
LEFT JOIN clients.clients_events_value_name cevn ON ce.Id = cevn.ClientEventsId 
where ClientId = @clientId and Date BETWEEN @from and @to";

var result = DefaultConnection.Query<ExtentedClientEventsModel>(
    sqlStr, new { clientId, from, to = to.AddDays(1) }).AsList();

(注意:不同的数据库对参数有不同的语法;如果@clientId等不起作用,请尝试:clientId$clientId等)


推荐阅读