Запрос Cosmos Db linq для дочернего элемента не работает

#linq #azure-cosmosdb

#linq #azure-cosmosdb

Вопрос:

Сегодня я потратил на это так много часов, но безуспешно, надеюсь, кто-нибудь сможет мне помочь. Я пытаюсь Cosmos DB и LINQ, здесь элементы в БД:

 |Customer
    |String Property1
    |String Property2
    |ICollection Orders
        |String PropertyA   <--Select on this property
 

Как я могу выбрать элемент Customer, который имеет PropertyA определенное значение?

Я пробовал это и многие другие:

 var customer = await context.Customers.Select(_s => _s.Orders.Select(p => p.PropertyA == "123456")).FirstAsync()
 

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ 1: я тоже пробовал это:

         var customer1 = (from _customer in context.Customers
                         where _customer.Orders.Any(_a => _a.MyId.Contains("2012031007470165"))
                        select _customer).ToList();
 

Вот сообщение об ошибке, которое я получил:

Выражение LINQ ‘DbSet() .Где(c => EF.Property<ICollection>(c, «Orders») .AsQueryable() .Any(o => o.MyId.Содержит («2012031007470165»)))’ не удалось перевести. Либо перепишите запрос в форме, которую можно преобразовать, либо явно переключитесь на оценку клиента, вставив вызов ‘AsEnumerable’, ‘AsAsyncEnumerable’, ‘ToList’ или ‘ToListAsync’. См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Ответ №1:

Если я правильно понял ваш вопрос

 var customer = await ctx.Customers.Include(c => c.Orders).FirstAsync(s => s.Orders.FirstAsync(p => p.PropertyA == "123456"));
 

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

1. Спасибо за ваш ответ, но он не работает. Я забыл упомянуть, что заказы на сборку принадлежат OwnsMany: ModelBuilder. Сущность <Клиент>().OwnsMany(p => p.Заказы)

Ответ №2:

Я нашел решение, правильный ответ (использовать с cosmos SQL api и не более с Entity Framework)::

             Customer _customerResult = _DBcontainer.GetItemLinqQueryable<Customer>(true)
                                        .Where(_w => _w.Orders.Any(c => c.Purchase_Id == "1234"))
                                        .AsEnumerable()
                                        .FirstOrDefault();