.NET core Entity Framework - экранирование символа "@" - PullRequest
0 голосов
/ 10 января 2019

Введение
Я использую PostreSQL JSON , который дает мне мощный API, но содержит некоторые странные символы.
EF обрабатывает некоторые из них (например, ->>), но имеет проблемы с другими (например, @>)

Цель:
Выполните следующий запрос как необработанный запрос в ядре .net EF:

SELECT * FROM todoitem WHERE "JsonPayload" @> '{"ListProp": [{"Name": "listProp1Name", "Value": "listProp1Value"}]}'

Текущая ситуация

string select = "SELECT * FROM todoitem";
string where = "WHERE \"JsonPayload\" @>";
string listQuery = "'{\"ListProp\": [{\"Name\": \"listProp1Name\", \"Value\": \"listProp1Value\"}]}'";

string query = $"{select} {where} {listQuery}";
Console.WriteLine(query);

var items = _context.TodoItems.FromSql(query).ToList();

Примечание: Пожалуйста, не вините меня за разделение строк здесь. Я просто сужал проблему. Выходная строка точно такая же, как та, которую я выполняю в базе данных (где она работает).

Проблема
Похоже, символ @ берет на себя вину, потому что он интерпретируется как именованный параметр.
Так что вопрос - как избежать этого?

также возможно, что скобки ({ и }) также будут проблематичными, так как они также используются в качестве переменных показателей. Пожалуйста, также напишите, если вы знаете, как избежать их.

Очевидно, я пытался погуглить, но, похоже, не принято избегать знака @.

Трассировка стека: это одинаково в обоих случаях - при использовании @> и @@>.

fail: Microsoft.EntityFrameworkCore.Query[10100]
      An exception occurred in the database while iterating the results of a query for context type 'dotnet_postgres_test.Models.TodoContext'.
      System.FormatException: Input string was not in a correct format.
         at System.Text.StringBuilder.FormatError()

Ответы [ 2 ]

0 голосов
/ 14 января 2019

возможно, это не точный ответ, но вы можете использовать dapper

с помощью dapper вы можете просто написать следующее:

var connection = new NpgsqlConnection(_configuration.GetConnectionString("DefaultConnection"));

var items = connection
    .Query<TodoItem>(
        @"SELECT * FROM todoitem WHERE ""JsonPayload"" @> '{""ListProp"": [{""Name"": ""listProp1Name"", ""Value"": ""listProp1Value""}]}'")
    .ToList();
0 голосов
/ 10 января 2019

на основе Как: напрямую выполнять SQL-запросы | Документы Microsoft и @ - C # Справочник | Документы Microsoft


    var sql=@"SELECT * FROM todoitem WHERE ""JsonPayload"" @> '{""ListProp"": [{""Name"": ""listProp1Name"", ""Value"": ""listProp1Value""}]}'";

   var items  = _context.Database.SqlQuery<TodoItems>(sql).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...