0

我想要完成的是在 ttSheduleDay 中选择 dateTimeStart。下面的 JSON 是一个员工的节点,该函数接收三个参数,一个 empUID、一个日期和一个值(开始/停止或持续时间)。

我要选择的节点是 dsShedule > ttEmployee > empUID 等于第一个参数,其中 ttShedule > ttSheduleDay > dat 等于日期参数,第三个参数我将使用 if 语句执行。JSON下面

JSON

{
    "dsShedule": {
        "ttEmployee": [
            {
                "empUID": 2649,
                "empNameFirst": "firstname",
                "empNameLast": "lastname",
                "empFunction": "employee",
                "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
                            }
                        ]
                    }
                ]
            },

我已经拥有的代码是选择 ttShedule

JObject jObj = JObject.Parse(json);
var linq = jObj["dsShedule"]["ttEmployee"]
                // first filter for a single emp by empUID
                         .First(emp => emp["empUID"].Value<int>() == Convert.ToInt16(empUID))
                         .SelectToken("ttShedule");

Stackoverflow 上有人建议的代码是:

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))

但这在 ttShedule 的 select 语句上失败了。我想知道如何扩展我的代码以使用第二个 if 语句选择 dateTimeStart 节点。

提前致谢

4

1 回答 1

0

这是编写查询的一种方法:

var employeeId = 2649;
var date = new DateTime(2013, 5, 20);

var query =
    from emp in jObj.SelectToken("dsShedule.ttEmployee")
    where emp.Value<int>("empUID") == employeeId
    let day =
        (from sched in emp["ttShedule"]
        from d in sched["ttSheduleDay"]
        where d.Value<DateTime>("dat") == date
        select d).FirstOrDefault()
    where day != null
    select day.Value<DateTime>("dateTimeStart");

我怀疑您面临的问题是具有指定 id 的员工不存在并且First()呼叫失败。这不会遇到同样的问题。

于 2013-05-27T06:30:46.493 回答