1

私は最初の EntityFramework ソリューションに取り組んでいますが、困惑しています。

結果の「カレンダー」エンティティ オブジェクトを反復処理しているとき、プロパティcalendar.ref_calendar_premisis.premisisはインスタンス化されていません ( null)。次のように、構文ツリー プロジェクションで条件付きの「インクルード」を制御したかったため、遅延読み込みを無効にした理由を理解しています。

    private List<CalendarBlockDTO> FillUserCalendar(DateTime start, DateTime end, int uid, bool everything)
    {
        var result = new List<CalendarBlockDTO>();

        using (var db = new ViggoEntities())
        {
            //We need to disable lazyloading to use the "expression tree" syntax
            db.Configuration.LazyLoadingEnabled = false;

            //flip our "everything" so we can compare it to our "special" column
            int specialScope = Convert.ToInt32(!everything);

            //Build a query "Projection" with "expression tree" syntax
            var query = from c in db.calendars
                        select new
                            {
                                calendarEntry = c,

                                createdByUser = c.MadeByUser,

                                premisesBookings = c.ref_calendar_premises.Where
                                (
                                    rcp => rcp.deleted == 0 &&
                                     (
                                            //started before the start-parameter AND ended after start-parameter
                                        (rcp.timestart < start && rcp.timeend > start) ||
                                            //OR startet before the end-parameter AND ended after the end-parameter
                                        (rcp.timestart < end && rcp.timeend > end) ||
                                            //OR startet before the start-parameter AND ended after the end-paremeter
                                        (rcp.timestart < start && rcp.timeend > end) ||
                                            //OR startet after the start-parameter AND ended before the end-parameter
                                        (rcp.timestart > start && rcp.timeend < end)
                                    )
                                ),

                                attendingGroups = c.ref_groups_calendar.Where
                                (
                                    rug => rug.deleted == 0
                                ),

                                groups = c.ref_groups_calendar.Select( rgc => rgc.usergroup ),

                                ////Assignments not implemented yet
                                ////assignments = c.

                                schedules = c.ref_calendar_schedule.Where
                                (
                                    sch => sch.deleted == 0
                                )
                            };

            var calEntries =
                query.ToArray().Select(c => c.calendarEntry).
                Where(
                        //If only special requested, show only special
                        c => c.special >= specialScope &&
                        //If not "MadeInInfo", show for creator as well
                        (c.madeininfo==0 && c.made_by == uid) || 
                        //Else, show to involved users
                        (c.ref_groups_calendar.Any(rgc => rgc.usergroup.ref_users_groups.Any(rug => rug.userid == uid)))
                        );

            foreach (var calendar in calEntries)
            {
                //I WANT THIS TO NOT THROW AN EXCEPTION, PREMIS SHOULD NOT BE NULL
                if (calendar.name == "Dinner with Allan" && calendar.ref_calendar_premises.Any(rcp => rcp.premis == null))
                    throw new Exception("Premis not instantiated!");

                result.AddRange(CalendarToCalendarBlockDTOs(calendar));
            }
        }

        return result;
    }

次のようなものを追加してみました:

...
room = c.ref_calendar_premises.Select(r => r.premis),
...

...しかし、役に立たない。私たちのテスト データでは、「Dinner with Allan」イベント用に部屋が予約されていますが、プレミス エンティティを読み込むことができないようです。

EntityFramework、LINQ to SQL、またはその他の ORM の経験がないため、明らかな何かが欠けている可能性があります。

助言がありますか?

4

1 に答える 1

0

DB責任者の腕をねじったところ、変換エラーのためにすべての行でpremisisidがnullであることがわかりました(実際のデータではなく、テストデータのドキュメントを見ていました)。入力と時間をありがとう、私は自分自身を見せるだけです0_0

于 2012-12-17T10:45:57.450 に答える