仅 Dapper returns 空值
Dapper only returns Null values
我在使用 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);
当我在客户端执行查询时 returns 16 条记录。但是当我使用 Dapper 时它 returns 4 条记录。并且只有那些具有 Doer == null 字段的。
我尝试用动态类型替换模型,但没有帮助。
Dapper 不会发明返回的行数。如果 Dapper 说有 4 行,那么以下两件事之一:
- 您发现了 Dapper 多年未见的利基边缘案例
- 你的查询实际上只做了 return 4 行
现在,我打开 到“1”,但实际上“2”的可能性更大。我怀疑这里真正的问题是参数 - 或者缺少 there-of。永远不要使用连接从值构建 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
等)
这是请求在 DbForge 客户端中给出的内容
这就是 Dapper returns:
当时
我在使用 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);
当我在客户端执行查询时 returns 16 条记录。但是当我使用 Dapper 时它 returns 4 条记录。并且只有那些具有 Doer == null 字段的。 我尝试用动态类型替换模型,但没有帮助。
Dapper 不会发明返回的行数。如果 Dapper 说有 4 行,那么以下两件事之一:
- 您发现了 Dapper 多年未见的利基边缘案例
- 你的查询实际上只做了 return 4 行
现在,我打开 到“1”,但实际上“2”的可能性更大。我怀疑这里真正的问题是参数 - 或者缺少 there-of。永远不要使用连接从值构建 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
等)
这是请求在 DbForge 客户端中给出的内容
这就是 Dapper returns:
当时