【问题标题】:How should I pass an array to the FIELD statement using Dapper, c#我应该如何使用 Dapper,c# 将数组传递给 FIELD 语句
【发布时间】:2019-05-09 19:59:09
【问题描述】:

我正在尝试使用 Dapper 将数组作为参数传递。 我的值数组必须进入 FIELD 部分。

我试图将数组元素加入一个字符串并传递它。还是不行。

Guid[] myArr = Ids.ToArray(); // Ids are List<Guid>
var script = @"SELECT * FROM table WHERE Id in @Ids ORDER BY FIELD(Id, @param)";
using (var connection = database.Connection)
            {
                return connection.Query<MyDataType>(script, new {Ids = Ids, param = myArr}).ToList();
            }

此查询只是按 ID 进行排序。我还传入了 param = Ids。还是不行。

【问题讨论】:

  • 有趣;简短的版本是“这是我第一次看到这种语法,因此 Dapper 目前不支持它” - 所以:现在没什么好。
  • 当我将值加入字符串时,我得到“'1','2','3'”。我想去掉开头和结尾的双引号;所以我使用了 .Trim('"')。无法让它工作
  • 你确定那些双引号不仅仅是调试器“有用”吗?它尝试将文本格式化为合法的 C# 语法,这意味着它会添加引号并转义有问题的字符,这两个问题在 Stack Overflow 上都有大量的问题。

标签: c# mysql field dapper


【解决方案1】:

将列表转换为dapper参数列表中的数组。

 var sqlQuery = "Select * from table Where Columnname IN @periodIdStr";
 var result = dapperUOW.Connection.Query<Entity>(sqlQuery ,
                        param: new { periodIdStr = periodIds.ToArray() }, transaction: dapperUOW.Transaction).ToList();
        

【讨论】:

    【解决方案2】:

    根据这个问题SELECT * FROM X WHERE id IN (...) with Dapper ORM,您应该能够使用 dapper 执行WHERE in,但需要注意数组中项目数量的限制。

    然后您也可以拆分ORDER BY FIELD SQL 并使用 linq 对您的结果执行OrderBy

    编辑: 这行得通吗?

    Guid[] myArr = Ids.ToArray(); // Ids are List<Guid>
    var script = @"SELECT * FROM table WHERE Id in @Ids)";
    using (var connection = database.Connection)
    {
        var myDataTypeObjects = connection.Query<MyDataType>(script, new {Ids = Ids}).ToList();
        myDataTypeObjects = myDataTypeObjects.OrderBy(x => Ids.IndexOf(x.Id)).ToList();
        return myDataTypeObjects;
    }
    

    【讨论】:

    • 不,我不能通过 Linq 使用 OrderBy。它违背了使用 FIELD() 的全部目的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多