如何使用 simple.odata.client 扩展分层数据
How to expand hierarchical data with simple.odata.client
在我们的数据模型中,我们有分层数据。例如,我们有以下结构:
Product : Category (one to many)
Category : CategoryType (one to many)
如果我们想要某个产品的相关类别以及每个类别的相关类别类型,我们可以使用 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();
请检查包含非类型化、类型化和动态版本的 Simple.OData.Client 个测试:
[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());
}
[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);
}
在我们的数据模型中,我们有分层数据。例如,我们有以下结构:
Product : Category (one to many)
Category : CategoryType (one to many)
如果我们想要某个产品的相关类别以及每个类别的相关类别类型,我们可以使用 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();
请检查包含非类型化、类型化和动态版本的 Simple.OData.Client 个测试:
[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());
}
[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);
}