使用 Dapper ORM 将调用 SQL 函数的 SQL 代码转换为 C#

问题描述 投票:0回答:1

我已将之前在 SQL 中定义的 split 函数转换为 C#。现在,当我尝试转换调用 split 函数的剩余 SQL 代码时,我遇到了异常

System.NotSupportedException
,我该怎么做才能缓解这个问题?

SQL代码:

DECLARE @SomeNumbers varchar(max) = '665416:ABC,665416:XYZ';

DECLARE @Temp table (SomeNumber int, GridType varchar(20))

INSERT @Temp(SomeNumber, GridType)
SELECT CAST(Substring(Item, 1, Charindex(':', Item)-1) AS INTEGER), Substring(Item, Charindex(':', Item)+1, LEN(Item)) FROM dbo.[fnSplit](@SomeNumbers, ',')                

SELECT * from @Temp

结果如下所示

我试图使用 Dapper 获得相同的结果,但是 这是我的代码 - 如果我尝试使用 kvp 列表填充临时表,我会得到

System.NotSupportedException

       string SomeNumbers = "665416:ABC, 665416:XYZ";
        List<string> result = FunctionExtension.fnSplit(SomeNumbers, ",");


        List<KeyValuePair<int, string>> lstKvp = result.Select(s =>
        {
            string[] parts = s.Split(":");
            return new KeyValuePair<int, string>(Convert.ToInt32(parts[0]), parts[1]);
        }).ToList();


        var parameters = new DynamicParameters();
        parameters.Add("@lstKvp", lstKvp);
        
        string sql = @"
            DECLARE @Temp table (SomeNumber int, GridType varchar(20))

            INSERT @Temp(SomeNumber, GridType)
            SELECT @lstKvp              

            SELECT * from @Temp";


        var res = await conn.QueryAsync(sql, parameters);

分割功能

   public static List<string> fnSplit(string sInputList, string sDelimiter = ",")
   {
       // Create a list of strings to store the result
       List<string> list = new List<string>();
       // Split the input string by the delimiter and trim the whitespace
       string[] items = sInputList.Split(sDelimiter, StringSplitOptions.TrimEntries);
       // Loop through the items and add them to the list
       foreach (string item in items)
       {
           // Check if the item is not empty
           if (item.Length > 0)
           {
               // Add the item to the list
               list.Add(item);
           }
       }
       // Return the list
       return list;
   }
c# sql sql-server dapper micro-orm
1个回答
0
投票

只是为了扩展我的评论。

如果您想在 SQL 中执行此操作,请考虑以下事项:

DECLARE @SomeNumbers varchar(max) = '665416:ABC,665416:XYZ';

DECLARE @Temp table (SomeNumber int, GridType varchar(20))

Insert Into @Temp
Select left(value,charindex(':',value)-1)
      ,substring(value,charindex(':',value)+1,50)
 From  string_split(@SomeNumbers,',')

 Select * from @Temp
© www.soinside.com 2019 - 2024. All rights reserved.