2015-03-23 2 views
1

В нашей модели данных у нас есть иерархические данные. У нас есть, например, следующая структура:Как расширить иерархические данные с помощью simple.odata.client

Product - Category (on to many) 
Category - CategoryType (on to many) 

Если мы хотим иметь родственные категории определенного продукта, а также связанное с ними categorytypes каждой категории мы можем построить это с URL-адресом, как это:

<urlbase>/Products(1)?$expand=Category($expand=CategoryType) 

Этих отлично работает в браузере. Вопрос в том, как это можно сделать в simple.odata.client OData v4? Мы пытаемся это, но не заставить его работать:

var client = new ODataClient(ConfigSettingsProvider.ODataBaseUri); 
var client.For<Product>()filter(p=>p.Id == 1).Expand(p => p.Categories).Expand(c => c.CategoryTypes).FindEntriesAsync(); 
+0

Спасибо Soner для редактирования! – jopa

+0

У меня есть нетипизированная версия для работы, но она становится очень грязной со сложной структурой данных. – jopa

ответ

2

Пожалуйста, проверьте тесты Simple.OData.Client, которые содержат как нетипизированные, набранные и динамические версии:

Нетипизированные: https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/FindTests.cs

[Fact] 
public async Task ExpandOne() 
{ 
var product = (await _client 
    .For("Products") 
    .OrderBy("ProductID") 
    .Expand("Category") 
    .FindEntriesAsync()).Last(); 

Assert.Equal("Condiments", (product["Category"] as IDictionary<string, object>)["CategoryName"]); 
} 
[Fact] 
public async Task ExpandMany() 
{ 
var category = await _client 
    .For("Categories") 
    .Expand("Products") 
    .Filter("CategoryName eq 'Beverages'") 
    .FindEntryAsync(); 

Assert.Equal(12, (category["Products"] as IEnumerable<object>).Count()); 
} 
[Fact] 
public async Task ExpandSecondLevel() 
{ 
var product = (await _client 
    .For("Products") 
    .OrderBy("ProductID") 
    .Expand("Category/Products") 
    .FindEntriesAsync()).Last(); 

Assert.Equal(12, ((product["Category"] as IDictionary<string, object>)["Products"] as IEnumerable<object>).Count()); 
} 

Типоразмер: https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/FindTypedTests.cs

[Fact] 
public async Task ExpandOne() 
{ 
var product = (await _client 
    .For<Product>() 
    .OrderBy(x => x.ProductID) 
    .Expand(x => x.Category) 
    .FindEntriesAsync()).Last(); 

Assert.Equal("Condiments", product.Category.CategoryName); 
} 
[Fact] 
public async Task ExpandManyAsArray() 
{ 
var category = await _client 
    .For<Category>() 
    .Expand(x => x.Products) 
    .Filter(x => x.CategoryName == "Beverages") 
    .FindEntryAsync(); 

Assert.Equal(12, category.Products.Count()); 
} 
[Fact] 
public async Task ExpandManyAsList() 
{ 
var category = await _client 
    .For<CategoryWithList>("Categories") 
    .Expand(x => x.Products) 
    .Filter(x => x.CategoryName == "Beverages") 
    .FindEntryAsync(); 

Assert.Equal(12, category.Products.Count()); 
} 
[Fact] 
public async Task ExpandManyAsIList() 
{ 
var category = await _client 
    .For<CategoryWithIList>("Categories") 
    .Expand(x => x.Products) 
    .Filter(x => x.CategoryName == "Beverages") 
    .FindEntryAsync(); 

Assert.Equal(12, category.Products.Count()); 
} 
[Fact] 
public async Task ExpandManyAsICollection() 
{ 
var category = await _client 
    .For<CategoryWithICollection>("Categories") 
    .Expand(x => x.Products) 
    .Filter(x => x.CategoryName == "Beverages") 
    .FindEntryAsync(); 

Assert.Equal(12, category.Products.Count()); 
} 
[Fact] 
public async Task ExpandSecondLevel() 
{ 
var product = (await _client 
    .For<Product>() 
    .OrderBy(x => x.ProductID) 
    .Expand(x => x.Category.Products) 
    .FindEntriesAsync()).Last(); 

Assert.Equal(12, product.Category.Products.Length); 
} 
+0

Спасибо за ответ Vagif. Я получил все, чтобы работать с нетипизированной версией. У меня все еще есть проблема с типизированным синтаксисом при расширении. Если вы примете мой пример выше, когда я хочу перейти на все уровни, мне нужно написать что-то вроде этого: 'Expand (p => p.Category.CategoryType.Dummy)'. Если CategoryType является списком, это невозможно сделать. – jopa

+1

Да, это возможно, хотя и без документов. Используйте этот синтаксис: Expand (p => p.Category.CategoryType.Select (x => x.Dummy) –

+0

Спасибо Vagif. Работает как шарм! – jopa