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

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

По этой причине я использую отражение для перебора DTO и построения SQL-запроса на основе того, какие свойства имеют значения. Я возвращаю Tuple из моего построителя запросов, который содержит 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 в значение для запроса? Я здесь совершенно не на базе? Заранее благодарим за просмотр и любые предложения?

3
NodeJustin 14 Сен 2018 в 10:35

2 ответа

Лучший ответ

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

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

sqlQuery.Add("Municipality LIKE '%' + @Municipality+ '%'");
2
Ivan Stoev 14 Сен 2018 в 07:51

Я предполагаю, что ядро EF не поддерживает напрямую sqlparameter, поэтому я использую образец this. 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();
0
OMANSAK 14 Сен 2018 в 08:03