如何告诉Dapper在使用“ IN”的“ WHERE”子句中将varchar用于参数列表?

时间:2018-06-27 00:08:29

标签: c# sql sql-server dapper

我找到了使用Dapper使用VARCHAR作为输入来搜索string字段的说明和解决方案:

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

来源:Dapper and varchars

但是有没有办法使它适应列表中的每个项目(使用IN子句)进行DbString转换?

我要运行的查询如下:

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针对此查询在IN子句中使用ansi字符串?

1 个答案:

答案 0 :(得分:5)

您应该能够传递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 })