我正在尝试选择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}(为什么括号?)。
下面是变量图片:
你可以看到uid是空的,我错过了什么?
提前致谢
答案 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);
修改强>
我不确定你到底想要什么,但这应该会给你一个想法。
使用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))