EFCore 2.1动态SQL参数

时间:2018-09-14 07:35:36

标签: .net sql-server .net-core ef-core-2.1

我认为我在这个方向上是正确的,但是遇到一些我说实话的事情却让我很沮丧。

我有一个带有Geography的表,因此,到目前为止,在EFCore的地理支持之前,我正在为一个特定的表构建自己的SQL查询。它实际上是一种搜索,因此它基于一组可以传递到终点的查询参数进行动态构建。

因此,我使用反射来遍历DTO并根据具有值的属性构建SQL查询。我要从查询构建器返回一个元组,其中包含一个List<SqlParameter>List<string>,后者是原始sql,而前者是参数。

然后,我将它们汇总在一起。

我遇到以下问题:

  //This is inside my SQL Param builder method which returns a 
  //Tuple of sqlQuery and sqlParams
  if (!string.IsNullOrEmpty(search.Municipality))
  {
    sqlQuery.Add("Municipality LIKE %@Municipality%");
    sqlParams.Add(new SqlParameter("@Municipality", search.Municipality));
  }

  //Thi lines aggregates the result to build a SELECT * FROM query
  sql = sqlParams.Item2.Aggregate(sql, (current, t) => current + " AND " + t);

  //This executes the query
  return DbSet.FromSql(sql, sqlParams.Item1.ToArray()).ToListAsync();

  //This is the generated SQL string that is printed from the sql variable above 
  SELECT * FROM AirportData WHERE Municipality LIKE %@Municipality%

  //This is the error I get from EFCore
  System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '@Municipality'.

我现在仅使用1个参数来实现此功能。

有什么想法为什么不将SQL Param转换为查询值?我在这里完全不在基地吗?在此先感谢您的查找和任何建议?

2 个答案:

答案 0 :(得分:2)

该错误不是来自EF Core,而是SqlServer,因为%@Municipality%不是有效的SQL表达式。

它应该类似于'%' + @Municipality + '%'N'%' + @Municipality + N'%',因此请相应地修改您的SQL构建器,例如

sqlQuery.Add("Municipality LIKE '%' + @Municipality+ '%'");

答案 1 :(得分:0)

我猜想EF核心不直接支持sqlparameter,所以我使用示例。 FromSql(string,params object[]) 字符串:sql查询 params:sql参数(@key或{0})

SqlCommand command = new SqlCommand
                    {
                        CommandText = @"SELECT DISTINCT * FROM F_SearchQuery(@keys)"
                    };
                    SqlParameter k = new SqlParameter("@keys", keys ?? (object)DBNull.Value);  
                    return _repositoryCustom.JobSearchQuering.FromSql(command.CommandText, k).ToList();