我想要完成的是选择ttSheduleDay中的dateTimeStart。下面的JSON是一个雇员的节点,该函数接收三个参数:empUID,日期和值(开始/停止或持续时间)。
我想要选择的节点是dsShedule>的位置。 ttEmployee> empUID等于第一个参数,其中ttShedule> ttSheduleDay> dat等于date参数和我将用if语句执行的第三个参数。在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节点。
提前致谢
答案 0 :(得分: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()
调用失败。这不会遇到同样的问题。