#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
}