.NET Core 3.1 с сопоставлением документов PostreSQL jsonb JsonDocument не работает, потому что «выражение LINQ не может быть переведено»

#c# #json #postgresql #.net-core #entity-framework-core

#c# #json #postgresql #.net-core #entity-framework-core

Вопрос:

Я попытался следовать руководству Npgsql по доступу к json DOM через динамическое сопоставление. В руководстве предлагается использовать JsonDocument , а затем использовать .GetProperty(string) его, но, похоже, он доступен только через .RootElement (который является a JsonElement , и он содержит GetProperty метод).

В любом случае, я получаю это исключение:

 System.InvalidOperationException: The LINQ expression 'DbSet<GameEntity>
.Where(g => g.GameInfo.GetProperty("ReadableIdentifier").ToString() == __readableIdentifier_0)' 
could not be translated. 
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly 
by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). 
  

Я попробовал несколько решений:

  1. Работает: добавление AsEnumerable() к запросу, но это противоречит цели, поскольку он получает все данные без фактического доступа к данным JSON изначально
  2. Работает: вместо этого меняется на POCO — но это сильно ограничивает гибкость, которую я хочу от документа JSON
  3. Не работает: удаление services.AddNewtonsoftJson(...) из ConfigureServices(...) in Startup , поскольку это было необходимо для установки ответов контроллера options.SerializerSettings.ReferenceLoopHandling
  4. Не работает: разыменование Newtonsoft.Json (я использую Swagger, и, похоже, это требуется).

В идеале я хотел бы, чтобы приведенный ниже запрос работал изначально и с правильным переводом, без необходимости загружать все записи перед выполнением операций:

 var gameEntity = _context.Games
            .Include(x => x.Characters)
            //.AsEnumerable()
            .Where(x => x.GameInfo.GetProperty("ReadableIdentifier").ToString() == readableIdentifier)
            .FirstOrDefault();
  

Есть ли что-нибудь, что я пропустил?

Комментарии:

1. Это должно быть помечено C # и EF Core, а не что-либо еще! Эта проблема хорошо объяснена в документации EF Core: learn.microsoft.com/en-us/ef/core/querying/client-eval

2. Привет, @CoolBots, спасибо за ответ. Могу ли я попросить у вас источник?

3. Я отредактировал свой первоначальный комментарий, чтобы добавить ссылку на документ. В принципе, запрос LINQ должен быть переведен в SQL (оценка на стороне клиента). Вам нужно будет переписать свой запрос. На странице, на которую я ссылался, также есть примеры — посмотрите раздел » Оценка неподдерживаемого клиента » этого документа.

4. Мои извинения, но я чувствую, что вы пропустили отправленную мной ссылку. Ссылка на Npgsql указывает что-то очень похожее в их документации в качестве примера, так действительно ли это так плохо с моим запросом?

5. Я думаю, что это GetProperty вызов, который вызывает ошибку; У меня нет времени на данный момент, чтобы разобраться в этом глубже, но я пропустил эту ссылку; Я удалил свой downvote, поскольку я вижу, на чем основано обоснование остальных ваших тегов.