当前位置: 首页 > 面试题库 >

如何在Dapper中使用“在哪里”

羊新翰
2023-03-14
问题内容

我一直在尝试失败,在Dapper中使用IEnumerable<string>with withWHERE IN子句已经有一段时间了。

在文档中,它确实说IEnumerable<int>支持在a中使用,WHERE IN但我什至无法使它正常工作。

Dapper allow you to pass in IEnumerable<int> and will automatically parameterize your query.

我不断收到的错误消息是Sql语法错误。 Incorrect syntax near ','.

我整理了一些测试代码,希望它们能证明我正在尝试实现的目标。

string connString = "Server=*.*.*.*;Database=*;User Id=*;Password=*;";

string sqlStringIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE StringId IN (@str)";

string sqlIntegerIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE ID IN (@integer)";


using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();

    List<int> integers = new List<int>{ 1, 2, 3 };
    List<string> strings = new List<string> { "A", "B", "C" };

    var parameters = new {str = strings, integer = integers };

    //fails here
    IEnumerable<string> intTest = conn.Query<string>(sqlIntegerIn, parameters, commandType: System.Data.CommandType.Text);

    //and here
    IEnumerable<string> stringTest = conn.Query<string>(sqlStringIn, parameters, commandType: System.Data.CommandType.Text);

}

问题答案:

为了执行此处需要的操作,dapper需要即时更改SQL-因此需要 真正 确保它在做正确的事情。常规有效的SQL语法包括括号:

WHERE StringId IN (@str)

为了消除歧义, voodoo dapper语法 省略 了括号:

WHERE StringId IN @str

如果检测到此错误,它将查找名为的参数str,并将其扩展为以下参数之一:

WHERE 1=0 -- if no values
WHERE StringId = @str -- if exactly one value
WHERE StringId IN (@str0, @str1, ...) -- if more than one value

但简短的版本:删除括号。



 类似资料:
  • 本文向大家介绍Dapper.NET 在LINQPad中使用Dapper,包括了Dapper.NET 在LINQPad中使用Dapper的使用技巧和注意事项,需要的朋友参考一下 例 LINQPad非常适合测试数据库查询,并且包含NuGet集成。要在LINQPad中使用Dapper,请按F4打开“查询属性”,然后选择“添加NuGet”。搜索精巧的点状网,然后选择添加到查询。您还将需要单击“添加名称空间

  • 本文向大家介绍Dapper.NET 在C#中使用Dapper,包括了Dapper.NET 在C#中使用Dapper的使用技巧和注意事项,需要的朋友参考一下 例 将连接包装在一个Using块中将关闭连接

  • 问题内容: 我们可以使用注释的主要领域是什么?该功能是否可以替代基于XML的配置? 问题答案: 注释是元元对象,可用于描述其他元对象。元对象是类,字段和方法。向一个对象询问其元对象(例如)称为自省。内省可以走得更远,我们可以问一个元对象其注释是什么(例如)。内省和注释属于所谓的反射和元编程。 注释需要以一种或另一种方式解释才有用。注释可以在开发时由IDE或编译器解释,也可以在运行时由框架解释。 注

  • 我已经使用打包资源并生成。 但是当我升级到Android 24时,我发现。 是否应该使用?我怎么用它?我找不到任何关于它的文件。

  • 问题内容: 我们应该如何以及在何处使用静态修饰符: 1.领域和 2.方法? 对于例如在类中,字段的方法,如ABS(),ATAN(),COS()等是静态的,即它们可以作为被访问: 但是,为什么这是个好习惯呢? 说,我不是保持静态,而是创建类的对象并访问它,无论如何,我都会得到警告,您正在尝试以非静态方式访问静态方法(如所指出的那样) @duffymo编写,而不是Math类)。 更新1: 因此,实用程

  • 问题内容: 我是Angular 4的新手,所以谁能解释在Angular 4中的使用方式和位置? 实际上,我想从父组件覆盖子组件的某些CSS属性。此外,它在IE11上受支持吗? 问题答案: 通常, 可使用组合器将样式强制降低到 。这个选择器有一个别名>>>,现在还有另一个叫做:: ng-deep的别名。 由于 已弃用,建议使用 例如: 和 它将应用于子组件