Запрос OData в c#

#c# #linq #odata

#c# #linq #odata

Вопрос:

Я новичок как в odata, так и в c #, и я не могу понять, как перевести запрос URI следующим образом:

http://services.odata.org/Northwind/Northwind.svc/Customers (10)/Заказы?$expand=Order_Details

в c #, используя синтаксис метода linq.

Я пробовал этот способ:

 var customer = context.Customers.Where( x => x.Id == 10 ).First();

foreach(var order in customer.Orders.Expand("Order_Details")){
    //stuff
}
  

Но клиент.У Orders нет метода «Развернуть».
Как мне справиться с этими запросами, когда мне нужно развернуть свойство навигации, связанное с определенным объектом?

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

1. Добавьте правильный оператор using : using System.Data.Services.Client; .

2. Проблема в том, что я действительно могу использовать метод расширения с клиентами: var orders = context.Customers.Expand("Orders") правильно, но это приводит к этому запросу: http://services.odata.org/Nortwind/Northwind.svc/Customers?$expand=Orders

Ответ №1:

Прежде всего, ваш код не может скомпилироваться. x => c.Id == 10 неверно; также отсутствует закрывающий раздел на вашем foreach. Во-вторых, для этого вам необходимо включить заказы в вашу переменную customer .

Я использую эту службу Northwind v3, чтобы продемонстрировать это (http://services.odata.org/V3/Northwind/Northwind.svc /), а также LINQPad (www.linqpad.net )

 var customer = Customers.Expand("Orders/Order_Details")
                        .Where(cus => cus.CustomerID == "ALFKI");

foreach (var element in customer)
{
    element.Orders.Dump();
}
  

Это приводит к вызову URL-адреса, подобного этому:

 http://services.odata.org/V3/Northwind/Northwind.svc/Customers('ALFKI')?$expand=Orders/Order_Details
  

Вывод:

введите описание изображения здесь

Увеличенное изображение

// РЕДАКТИРОВАТЬ на основе комментариев ниже. Если вы не хотите просматривать таблицу customer и разворачивать orders И order_details, вы также можете сделать это следующим образом:

 var orders = Orders.Expand("Order_Details")
                   .Where(o => o.CustomerID == "ALFKI").Dump();
  

или

 var orders = Orders.Expand(ex => ex.Order_Details)
                   .Where(o => o.CustomerID == "ALFKI").Dump();
  

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

1. Спасибо. Извините за синтаксические ошибки, но я не вставлял свой код. В примере, который я только что написал, он работает, но в моем случае не работает (northwind был просто похожим случаем).

2. Что, если я не хочу расширять клиент, но мне просто нужны детали заказа и заказа? С помощью запроса, который вы написали, мы получаем информацию о заказе и детали заказа в соответствии с данными клиента, вместо этого с помощью: http://services.odata.org/V3/Northwind/Northwind.svc/Customers('ALFKI')/Orders?$expand=Order_Details мы получаем только «необходимую» информацию.

3. Я основывал свой пример только на вашем случае, потому что вы пошли тем же путем с customer -> order -> orderdetail . Я только хотел продемонстрировать, как это работает в основном.

4. Конечно, и это очень помогло. Но как бы вы преобразовали в c # запрос, который я написал в предыдущем комментарии? (таким образом, без расширения клиента, но расширяя его заказы)

Ответ №2:

Вам нужно будет запросить все дочерние свойства, которые вам нужны, как часть самого запроса OData.

попробуйте выполнить следующее

 context.Customers.Expand("Orders/Order_Details").Where(c => x => c.Id == 10 ).First();
foreach(var order in customer.Orders){
    //stuff
}