SelectMany не работает на cosmosDb для дочерних свойств? - PullRequest
0 голосов
/ 19 февраля 2020

Когда я пытаюсь использовать selectMany для запроса, который я строю против cosmosdb, я всегда получаю исключение:

Выражение LINQ 'DbSet .Where (t => t.Id == __timelineId_0) .SelectMany (source: t => EF.Property> (t, "GraduationEvents") .AsQueryable (), collectionSelector: (t, c) => new TransparentIdentifier (Outer = t, Inner = c)) 'не удалось быть переведенным. Либо переписать запрос в форме, которую можно перевести, либо переключиться на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо в ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Запрос не имеет значения, всегда, когда я использую selectMany, я получаю эту ошибку.

Пример запроса:

 await _dbContext.Timelines.Where(x => x.Id == timelineId).Select(x => x.GraduationEvents).SelectMany(x => x).ToListAsync();

Моя конфигурация объекта:

        public void Configure(EntityTypeBuilder<Timeline> builder)
    {
        builder.HasKey(x => x.Id);
        builder.HasAlternateKey(x => x.Id);
        builder.OwnsMany(x => x.GraduationEvents, x => x.OwnsMany(graduationEvent => graduationEvent.Subjects));
    }

Я также пытался использовать нативный cosmosClient, но когда я запрашиваю базу с простым sql, я получаю пустые объекты (все нули). Есть мысли, что я делаю не так?

Саджид - я попробовал ваше решение, но исключение осталось прежним

1 Ответ

0 голосов
/ 19 февраля 2020

Попробуйте вызвать напрямую .SelectMany () через свойство List (GraduationEvents).

Обычно я затем вызываю AsDocumentQuery (), чтобы сгенерировать запрос к CosmosDB, а затем выполнить этот запрос для получения результатов.

Некоторые псевдо c#, чтобы прояснить это немного:

var query = this.documentClient.CreateDocumentQuery(uri, options)
    .SelectMany(x => x.GraduationEvents).AsDocumentQuery();

List<T> results = new List<T>();
while (query.HasMoreResults)
{
    results.AddRange(await query.ExecuteNextAsync());
}

Редактировать: Этот подход использует собственную библиотеку Azure DocumentClient.

...