复杂的linq:嵌套的where语句JSON.net和linq

本文关键字:linq JSON net 语句 嵌套 复杂 where | 更新日期: 2023-09-27 18:15:03

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

我要选择的节点是dsschedule> ttEmployee> empUID等于第一个参数的节点,其中ttschedule> 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
                            }
                        ]
                    }
                ]
            },
我已经拥有的代码是选择ttschedule
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))

但是这在ttschedule的select语句上失败了。我想知道如何扩展我的代码来选择dateTimeStart节点与第二个if语句。

Thanks in advance

复杂的linq:嵌套的where语句JSON.net和linq

你可以这样写你的查询:

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()呼叫失败。这将不会遇到同样的问题。