JSON.net linq无法选择具有where语句的节点

时间:2013-05-23 12:27:13

标签: asp.net json linq json.net

我正在尝试选择empUID等于某个ID的节点。这是我的JSON片段

{
    "dsShedule": {
        "ttEmployee": [
            {
                "empUID": 2649,
                "empNameFirst": "Firstname",
                "empNameLast": "lastName",
                "empFunction": "AFWERKER DRUKKERIJ",
                "ttShedule": [
                    {
                        "UID": 47,
                        "empUID": 2649,
                        "datStart": "2013-05-20",
                        "datStop": "2013-05-20",
                        "regime": 1,
                        "state": "PLANNED",
                        "ttSheduleDay": [
                            {
                                "SheduleUID": 47,
                                "dat": "2013-05-20",
                                "dateTimeStart": "2013-05-20T08:00:00.000",
                                "dateTimeStop": "2013-05-20T17:00:00.000",
                                "duration": 8
                            }
                        ]
                    },
                    {
                        "UID": 57,
                        "empUID": 2649,
                        "datStart": "2013-05-21",
                        "datStop": "2013-05-21",
                        "regime": 1,
                        "state": "PLANNED",
                        "ttSheduleDay": [
                            {
                                "SheduleUID": 57,
                                "dat": "2013-05-21",
                                "dateTimeStart": "2013-05-21T08:00:00.000",
                                "dateTimeStop": "2013-05-21T17:00:00.000",
                                "duration": 8
                            }
                        ]
                    }
                ]
            },

我能够选择所有员工节点,但是当我尝试选择ID等于的节点(例如494323)时,无法找到它。

功能

        JObject jObj = JObject.Parse(json);
        int firstUID = 494323;
        var linq = jObj["dsShedule"]["ttEmployee"].Select(x => new
                        {
                            empUID = x.SelectToken("empUID"),
                            empNameFirst = x.SelectToken("empNameFirst"),
                            empNameLast = x.SelectToken("empNameLast"),
                            ttShedule = x.SelectToken("ttShedule")
                        });
        var uid = linq.Where(x => x.empUID.Equals(firstUID));

我正在使用VS2012,当我调试元素linq并查找empUID的值时,它显示值{494323}(为什么括号?)。

下面是变量图片:

enter image description here

你可以看到uid是空的,我错过了什么?

提前致谢

1 个答案:

答案 0 :(得分:3)

您不是选择查询中的值而是选择JToken对象:

empUID = x.SelectToken("empUID")

empUID是JToken类型(您可以在调试视图中看到类型)。 然后你尝试将一个整数与一个将失败的JToken进行比较。

只需选择以下值:

empUID = x.SelectToken("empUID").Value<int>()

比较时使用Value<T>

var uid = linq.Where(x => x.empUID.Value<int>() == firstUID);

修改

我不确定你到底想要什么,但这应该会给你一个想法。

  1. 使用给定的empUID
  2. 过滤第一个条目的ttEmployee数组
  3. 选择该条目的ttShedule数组
  4. 使用Where所有ttSchedule条目过滤,其中包含一个dat属性为给定值的ttSheduleDay:

    var linq = jObj["dsShedule"]["ttEmployee"]
             // first filter for a single emp by empUID
             .First(emp => emp["empUID"].Value<int>() == firstUID)
             // then select the ttShedule array of that emp
             .Select(emp => emp["ttShedule"])
             // now filter for whatever ttShedule you need
             .Where(shed => shed["ttSheduleDay"]
                          .Any(day => day["dat"].Value<DateTime>() 
                                                 == new DateTime(2013, 5, 24))