Как я могу сказать Dapper использовать varchar для списка параметров в предложении «WHERE», которое использует «IN»? - PullRequest
0 голосов
/ 27 июня 2018

Я нашел это объяснение и решение для использования Dapper для поиска поля VARCHAR, используя string в качестве ввода:

Query<Thing>("select * from Thing where Name = @Name", new {Name = 
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

Источник: Даппер и вархары

Но есть ли способ приспособить это для преобразования DbString для каждого элемента в списке (используя предложение IN)?

Запрос, который я пытаюсь выполнить, выглядит следующим образом:

Query<IndexRec>("SELECT * FROM T_INDEX WHERE CallId IN @callIds",
new { callIds = model.LogEntries.Select(x => x.Id) });

К сожалению, этот запрос выполняется медленно, потому что:

  1. model.LogEntries содержит около 300 предметов.
  2. T_INDEX.CallId - это поле VARCHAR(30).
  3. Как я понимаю, Dapper использует NVarchar со строками в предложении WHERE по умолчанию.
  4. Это вызывает неявное преобразование каждой строки в моей таблице в SQL, что значительно замедляет запрос.

Как я могу сказать Dapper использовать строки ANSI в моем предложении IN для этого запроса?

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны быть в состоянии передать список DbString пунктов, например:

var parameters = model.LogEntries
    .Select(x => new DbString 
    {
        Value = x.Id, 
        IsAnsi = true
    });

Query<IndexRec>("SELECT * FROM T_INDEX WHERE CallId IN @callIds", new { callIds = parameters })
...