Dapper возвращает только нулевые значения - PullRequest
1 голос
/ 06 августа 2020

Я столкнулся с проблемой при использовании 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. Я пробовал заменить модель на тип Dynami c, но это не помогло.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Это то, что выдает запрос в клиенте DbForge enter image description here

And this is what Dapper returns: enter image description here

at that введите описание изображения здесь

0 голосов
/ 06 августа 2020

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 et c не работает, попробуйте :clientId, $clientId, et c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...