【问题标题】:OData.Net doesn't allow contains in the $filterOData.Net 不允许包含在 $filter
【发布时间】:2015-09-14 03:22:22
【问题描述】:

我到处读到,在 OData v3 中您应该使用 substringof(),而在 v4 中您应该使用 contains()。我从 NuGet 安装了 Microsoft.AspNet.WebApi.OData,上面写着版本 5.5.1

奇怪的是, contains() 不起作用。我收到以下错误:

{"message":"URI 中指定的查询无效。发现了一个名为 'contains' 的未知函数。这也可能是对导航属性的键查找,这是不允许的。" ... }

相反,substringof() 工作正常。应该是这样吗?

【问题讨论】:

    标签: asp.net odata visual-studio-2015


    【解决方案1】:

    NuGet 包版本是 5.5.1,但这并不是指支持的 OData 版本。由于 OData v1-3 和 OData v4 有一些不兼容的变化,有两个版本的 WebAPI OData 包:

    ASP.NET Web API 2.2 for OData v1-3

    包 ID:Microsoft.AspNet.WebApi.OData,版本:5.5.1

    适用于 OData v4 的 ASP.NET Web API 2.2

    包 ID:Microsoft.AspNet.OData,版本:5.6.0

    所以您目前使用的是 OData v3,并且错误消息是正确的,OData v3 中没有定义 contains()

    【讨论】:

    • 你说的是绝对正确的在VS2013。但是,在 VS2015 中只有 1 包 Microsoft.AspNet.WebApi.OData (注意没有“for OData vx”),因此是我的问题。这是否意味着 Microsoft.AspNet.OData 尚不可用?
    • 可用包不应依赖于 IDE,而应依赖于您使用的 ASP 或 .NET 版本。在项目页面上,我没有看到任何暗示这两个 OData 包已合并 (github.com/OData/WebApi),而对于新的 ASP.NET 5/MVC6,似乎根本不支持 OData (github.com/OData/WebApi/issues/229)。请尝试创建 ODataFeed 对象的实例,然后检查导入的命名空间。 Microsoft.OData.Core 是 v4,Microsoft.Data.OData 是 v3。
    • 谢谢。它导入与 v3 行为一致的 Microsoft.Data.OData(substringof 有效且包含无效)
    【解决方案2】:

    为 WebApi 启用 OData 的两个 NuGet 包如下:

    Microsoft.AspNet.WebApi.OData 适用于 OData v1-3

    Microsoft.AspNet.OData 用于 OData v4

    尽管 v4 的名称中没有提到 WebApi,但它仍然可以使用。命名已更改并反映了包 ID(lukehellrunner 包括这些)

    两者的当前版本均为 5.7.0。

    【讨论】:

    • 看到您的帖子和 lukehellrunner 的答案之间的唯一区别是版本发生了变化,我是否正确?如果是这种情况,我认为这里更好的方法是编辑 lukehellrunner 的答案以更新版本,而不是发布全新的答案。
    • 我想指出的是,lukehellrunner 提到的包是错误的,并且在 NuGet 库中不存在。您可能是对的,我本可以编辑 lukehellrunners 答案来纠正错误。
    猜你喜欢
    • 2011-09-20
    • 2015-08-02
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2019-01-09
    • 2020-11-01
    • 2015-02-02
    相关资源
    最近更新 更多