【问题标题】:How to expand hierarchical data with simple.odata.client如何使用 simple.odata.client 扩展分层数据
【发布时间】:2020-12-02 20:42:09
【问题描述】:

在我们的数据模型中,我们有分层数据。例如,我们有以下结构:

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

【问题讨论】:

  • 我得到了无类型的版本,但复杂的数据结构变得非常混乱

标签: c# odata simple.odata.client


【解决方案1】:

请检查包含无类型、类型和动态版本的 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);
}

【讨论】:

  • 感谢 Vagif 的回复。我得到了所有可以使用无类型版本的东西。我在进行扩展时仍然有类型语法问题。如果您以上面的示例为例,当我想扩展到所有级别时,我需要编写如下内容:Expand(p=&gt;p.Category.CategoryType.Dummy)。如果 CategoryType 是一个列表,这是不可能的。
  • 是的,即使没有记录也是可能的。使用以下语法: Expand(p => p.Category.CategoryType.Select(x => x.Dummy)
  • 谢谢 Vagif。像魅力一样工作!
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多