#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();