如何使用Odata从嵌套在列表中的动态数据中进行筛选

本文关键字:动态 数据 筛选 列表 Odata 何使用 嵌套 | 更新日期: 2023-09-27 18:02:18

json文件示例

{
    "ProjectName": "14010-00 General Expenses",
    "ClientName": "Whiting",
    "Created": "2015-06-26T21:06:17.721Z",
    "Data": {
      "function": "LIT",
      "tag": "1461",
      "rack": "1",
      "slot": "4",
      "channel": "1"
    }
},
{
    "ProjectName": "104021-00 CPF",
    "ClientName": "Bonanza Creek",
    "Created": "2015-06-26T21:03:20.732Z",
    "Data": {
      "tag": "200",
      "function": "FT",
      "basemodel": "FT-200",
      "shortdescription": ""
    }
}

和我想根据Data的内容进行过滤,但是这在不同的组件之间差异很大。所以Component.cs文件拥有

public class Component{
    public string ClientName{get; set;}
    public string ProjectName{get; set;}
    ...
    public IDictionary<string, object> Data { get; set; }
}

问题可能是由于字典是由string,object而不是string,string组成的,然而大多数(如果不是全部的话)数据的值都是字符串。

所以a

~/component?$filter=ClientName eq 'Whitning'

将工作;但是,在

上查询失败。
~/component?$filter=Data/function eq 'FT'

并给出错误响应"属性'function'访问的父值不是单个值。属性访问只能应用于单个值。和尝试

~/component?$filter=Data/any(d: d/function eq 'FT')

给出错误响应"在类型'System.Collections.Generic.KeyValuePair_2OfString_Object'上找不到名为'function'的属性。"

那么我如何通过数据对象内的对象进行过滤,这些对象是动态创建的,并不总是存在的?

如何使用Odata从嵌套在列表中的动态数据中进行筛选

您是否使用Web API OData?如果是,则Data仅为动态属性容器。它不应该出现在有效载荷中。所以你的有效载荷应该是:

{
    "Id": "558dbec9940bc716801a95d4",
    "FacilityName": "Ray",
    "ProjectName": "14010-00 General Expenses",
    "ClientName": "Whiting",
    "ProjectNames": [],
    "Name": "IoList",
    "Created": "2015-06-26T21:06:17.721Z",
    "Updated": "2015-06-26T21:06:17.721Z",
    "function": "LIT",
    "tag": "1461",
    "rack": "1",
    "slot": "4",
    "channel": "1"
},{ ...