我如何使用OData过滤Dictionary <string,string =“”>?

时间:2017-10-26 23:23:19

标签: c# asp.net-web-api2 odata

我的Controller上有一个启用OData查询的操作,返回资产。

C#模型。

var asset = new Asset()
{
    Id = Guid.NewGuid().ToString(),
    Name = "Cool Asset Yo",
    Url = "http://test/test.asset",
    Tags = new[] {"test"},
    Properties = new Dictionary<string, string>
    {
        {"platform", "android"},
        {"dim_depth", "1.0"},
        {"dim_height", "1.0"},
        {"dim_width", "1.0"},
        {"item_type", "Trim"}
    }
}

返回JSON

 [
      {
        "name": "Cool Asset Yo",
        "properties": {
          "platform": "android",
          "dim_depth": "1.0",
          "dim_height": "1.0",
          "dim_width": "1.0",
          "item_type": "Trim"
        },
        "tags": [
          "test"
        ],
        "url": "http://test/test.asset",
        "id": "77d9b9df-4f4b-4fad-a1d3-af5075d52a62",
      }
 ]

有效的示例查询!

  • api/Asset?$filter=startswith(name, 'Cool')
  • api/Asset?$filter=tags/any(tag eq 'test')
  • api/Asset?$filter=id eq '77d9b9df-4f4b-4fad-a1d3-af5075d52a62'

现在失败: - (

  • api/Asset?$filter=properties/platform eq 'Android'
    • 错误:属性&#39;平台&#39;的属性访问的父值。不是单一的价值。属性访问只能应用于单个值。
  • api/Asset?$filter=properties/any(props: props/platform eq 'Android')
    • 错误:找不到名为&#39; platform&#39; on type&#39; System.Collections.Generic.KeyValuePair_2OfString_String&#39;。
  • api/Asset?$filter=properties/any(keyValue: keyValue('platform') eq 'Android')
    • 错误:名称为&#39; keyValue&#39;的未知函数被找到。这也可能是导航属性上的函数导入或键查找,这是不允许的。
  • api/Asset?$filter=properties/any(keyValue: keyValue eq 'Android')
    • 错误:检测到具有不兼容类型的二元运算符。找到操作数类型&#39; System.Collections.Generic.KeyValuePair_2OfString_String&#39;和&#39; Edm.String&#39;对于运营商类型&#39; Equal&#39;
  • api/Asset?$filter=properties['platform'] eq 'Android'
    • 错误:&#39;属性[&#39;平台&#39;] eq&#39; Android&#39;&#39;

如何使用&#39;平台获得资产列表? &#39; Android&#39;?我看到在模型中使用的Microsoft Documents通用字典中的示例,我没有看到任何$ filter示例。

2 个答案:

答案 0 :(得分:1)

在您的方案中,&#34;属性&#34;查看字典属性,但字典属性不是OData中的内置属性。

此外,您的有效负载看起来是普通的JSON序列化输出。它不是odata有效载荷。

你说你看过Microsoft Documents of Generic Dictionaries being used in a model中的例子,它是动态属性的用法。请注意&#34; 您的方案(字典)和动态属性&#34;之间有所不同。

最重要的,Web API OData现在支持过滤动态属性。 请参阅 commit

中的我的测试用例

希望它可以帮到你。

答案 1 :(得分:0)

Sam Xu是正确的,OData不支持字典属性,动态属性在我的场景中也不起作用。我被迫将我的属性包更改为自定义键值类型的列表。

C#模型。

var asset = new Asset()
{
    Id = Guid.NewGuid().ToString(),
    Name = "Cool Asset Yo",
    Url = "http://test/test.asset",
    Tags = new[] {"test"},
    Properties = new List<KeyValue>
    {
        new KeyValue("platform", "android"),
        new KeyValue("dim_depth", "1.0"),
        new KeyValue("dim_height", "1.0"),
        new KeyValue("dim_width", "1.0"),
        new KeyValue("item_type", "Trim")
    }
}

返回JSON

[
  {
    "name": "Cool Asset Yo",
    "properties": [
      {
        "key": "platform",
        "value": "android"
      },
      {
        "key": "dim_depth",
        "value": "1.0"
      },
      {
        "key": "dim_height",
        "value": "1.0"
      },
      {
        "key": "dim_width",
        "value": "1.0"
      },
      {
        "key": "item_type",
        "value": "Trim"
      }
    ],
    "tags": [
      "test"
    ],
    "url": "http://test/test.asset",
    "id": "77d9b9df-4f4b-4fad-a1d3-af5075d52a62",
  }
]

有效的示例查询!

api/Asset?$filter=properties/any(keyValue: keyValue/key eq 'platform' and keyValue/value eq '50129486')