c# - 我如何告诉 Dapper 在使用 "WHERE"的 "IN"子句中使用 varchar 作为参数列表?

标签 c# sql sql-server dapper

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

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

来源:Dapper and varchars

但是有没有办法对此进行调整以对列表中的每个项目执行 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 在 WHERE 子句中使用带有字符串的 NVarchar
  4. 这会导致在 SQL 中对我的表中的每一行进行隐式转换,从而显着降低查询速度。

我如何告诉 Dapper 在我的 IN 子句中为此查询使用 ansi 字符串?

最佳答案

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

关于c# - 我如何告诉 Dapper 在使用 "WHERE"的 "IN"子句中使用 varchar 作为参数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052874/

相关文章:

sql - 如果所有列值都为真,则返回真

c# - SqlDependency 仅在订阅时触发

c++ - 在我的代码中执行存储过程时出现问题

sql - 为什么 INSERT 语句的列列表中点分隔的前缀被忽略?

java - 将 'bits' 写入 C++ 文件流

sql - 帮助插入查询

c# - 确定 DataGridView 中的单元格位置

php - 如何在 PHP 中提供 mySQL 数据库的下载

c# - 在 WCF (C#) 中引用服务时出现问题

c# - VS for Mac - 使用自动布局实现横向和纵向 View