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

C# 如何使用Odata从嵌套在列表中的动态数据中进行筛选?,c#,json,dynamic,filter,odata,C#,Json,Dynamic,Filter,Odata,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"

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": ""
    }
}
我想根据数据的内容进行过滤,但是不同的组件之间差异很大。因此Component.cs文件

public class Component{
    public string ClientName{get; set;}
    public string ProjectName{get; set;}
    ...
    public IDictionary<string, object> Data { get; set; }
}
将工作;但是,查询在上失败

~/component?$filter=Data/function eq 'FT'
并给出了误差响应 “属性“函数”的属性访问的父值不是单个值。属性访问只能应用于单个值。”然后重试

~/component?$filter=Data/any(d: d/function eq 'FT')
给出错误响应 在类型“System.Collections.Generic.KeyValuePair\u 2OfString\u对象”上找不到名为“function”的属性。


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

您使用的是Web API OData吗?如果是,
数据
只是动态属性的容器。它不应该出现在有效载荷中。所以你的有效载荷应该是:

{
    "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"
},{ ...

我建议您使用OData作为数据源,并在对象上使用linq查询,这将自动生成URL中应用的过滤器作为输出。但它是否无法处理仍然存在的数据容器?数据容器?你是指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"
},{ ...