【问题标题】:OData V3 exclude propertyOData V3 排除属性
【发布时间】:2018-12-26 22:29:54
【问题描述】:

我希望通过 odata 从实体集合中排除特定属性。

我使用 .Expand("Files") 来检索该特定集合,它们是数据库中的文件,我想要文件的所有元数据(如 Name 和 MimeType),而不是二进制文件本身。

我不允许更改 OData 服务本身,所以如果可能的话,必须使用 odata 查询中的指令来完成。

有什么想法吗?提前谢谢。

UPDATE2:Vagif 很有帮助,但让我意识到我没有完全正确地表达我的问题。再次:道歉。实际属性可以在通过扩展“文件”返回的类中,但它必须为空。换句话说:我希望扩展的子记录具有未填充数据的属性。

更新:谢谢 nemesv。我确实应该更具体。 odata 服务是使用 c# 使用 Visual Studio 使用 odata nuget 包构建的。客户使用相同的工具。然而,服务器使用 odata 5.0.1。客户端任何我想要的版本,(现在我认为是 5.6)。

【问题讨论】:

  • 如何调用odata服务?哪个图书馆正在使用?使用 url 语法,您的查询应如下所示:http://localhost/odata/YourThings?$expand=Files&$select=YourProp,Files/Name,Files/MimeType

标签: c# linq odata


【解决方案1】:

如果您在客户端使用 C# 和 LINQ,您可以使用 Select 子句和匿名类型选择要包含在有效负载中的属性,例如:

var results = context.MyCollection.Select(x => new { x.Name, x.Category });

更新

从展开的实体中选择列的诀窍是您不需要显式地展开它:WCF 数据服务 LINQ 提供程序填写它。下面是一个使用 Northwind 数据模型的示例:

[Test]
public void SelectProductAndCategoryColumns()
{
    var result = _context.Products
        .Where(x => x.ProductID == 1)
        .Select(x => new { x.ProductID, x.Category.CategoryID, x.Category.CategoryName })
        .Single();
    Assert.AreEqual(1, result.ProductID);
    Assert.AreNotEqual(0, result.CategoryID);
    Assert.IsNotNull(0, result.CategoryName);
}

请注意,我在不使用 Expand 子句的情况下链接 Select 子句中的展开列。它以这种方式工作(但仅限于一个级别,您无法将它们进一步链接)。

【讨论】:

  • 听起来不错,但如何在扩展路径上做到这一点? var results = context.MyCollection.Expand("Files").Select(x => new { x.Name, x.Files.Name }); ?
  • @GerbenRampaart,我已经更新了我的答案,希望它能帮助你建立正确的陈述。
  • 到目前为止,您已经帮了很大的忙,(尤其是在这种情况下我没有必须使用 Expand 的事实,我不知道)但是请注意,我的问题是排除一个属性。这个解决方案强制返回一个匿名函数,破坏我的延迟链的语法。换句话说,以您为例,我只想排除“CategoryName”(或延迟加载它,没关系)。因为在我的场景中,我想延迟加载我的 BLOB 属性,它不能包含数据库记录中的字节。 (如果属性仍然存在也没关系,但我希望它为空)
  • OData 没有用于排除特定属性的指令,因此除了不需要的属性之外,包括所有属性是实现您想要实现的目标的唯一方法。您可以在此处阅读有关 OData v3 协议的更多信息:odata.org/documentation/odata-v3-documentation/url-conventions
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多