EFCore 2.1 Динамические параметры SQL - PullRequest
0 голосов
/ 14 сентября 2018

Я думаю, что нахожусь на правильном пути с этим, но встреча с чем-то, что я буду честным, ставит меня в тупик.

У меня есть таблица с географией, пока, пока поддержка Geo не придет в EFC, я создаю собственный SQL-запрос для конкретной таблицы. На самом деле это поиск, поэтому он строится динамически на основе набора параметров запроса, которые могут быть переданы в конечную точку.

Из-за этого я использую рефлексию для перебора DTO и построения SQL-запроса на основе значений, которые имеют свойства. Я возвращаю Tuple от моего построителя запросов, который содержит List<SqlParameter> и List<string>, последний - это raw sql, а первый - params.

Затем я собираю все вместе.

У меня возникает следующая проблема:

  //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 в значение для запроса? Я здесь совсем не в базе? Заранее спасибо за поиск и какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я предполагаю, что ядро ​​EF не поддерживает напрямую sqlparameter, поэтому я использую пример этого.FromSql(string,params object[]) строка: параметры запроса sql: параметры 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();
0 голосов
/ 14 сентября 2018

Ошибка не в EF Core, а в SqlServer, поскольку %@Municipality% не является допустимым выражением SQL.

Это должно быть что-то вроде '%' + @Municipality + '%' или N'%' + @Municipality + N'%', поэтому измените ваш SQL-конструктор соответствующим образом, например,

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