#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().
Я попробовал несколько решений:
- Работает: добавление
AsEnumerable()
к запросу, но это противоречит цели, поскольку он получает все данные без фактического доступа к данным JSON изначально - Работает: вместо этого меняется на POCO — но это сильно ограничивает гибкость, которую я хочу от документа JSON
- Не работает: удаление
services.AddNewtonsoftJson(...)
изConfigureServices(...)
inStartup
, поскольку это было необходимо для установки ответов контроллераoptions.SerializerSettings.ReferenceLoopHandling
- Не работает: разыменование 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, поскольку я вижу, на чем основано обоснование остальных ваших тегов.