Я думаю, что нахожусь на правильном пути с этим, но встреча с чем-то, что я буду честным, ставит меня в тупик.
У меня есть таблица с географией, пока, пока поддержка 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 в значение для запроса? Я здесь совсем не в базе? Заранее спасибо за поиск и какие-либо предложения?