0

私が達成しようとしているのは、ttSheduleDay 内で dateTimeStart を選択することです。その下の JSON は 1 人の従業員のノードです。この関数は、empUID、日付、および (開始/停止または期間) の値の 3 つのパラメーターを受け取ります。

選択したいノードは、dsShedule > ttEmployee > empUID が最初のパラメーターに等しい場所です。ここで、ttShedule > ttSheduleDay > dat は日付パラメーターに等しく、3 番目のパラメーターは 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 ステートメントで失敗しました。コードを拡張して、2 番目の if ステートメントで dateTimeStart ノードを選択する方法を考えていました。

前もって感謝します

4

1 に答える 1

0

クエリを作成する方法の 1 つを次に示します。

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 に答える