0

以下の (簡略化された) オブジェクト モデルを考えるとSchedule、特定の に対応するオブジェクトをロードする必要がありますが、人が取っているPersonselect のみをロードします。Class

私はプロジェクションを使用してそれを達成しており、正常に動作します(結合が多すぎるというEFプロファイラーを除く)。

今度は、ロードも行うという新しい要件がありますPerson.FunFacts。コメントアウトされたコード//FunFacts = s.Person.FunFacts,がそれを達成することを願っていました。ただし、そうではありません。

schedule.FunFactsコンテキストがまだアクティブな間にアクセスすることで、目標を達成できます。ただし、これにより、データベースへの追加のラウンド トリップが作成されます。

質問: プロジェクションをschedule.FunFactsプロキシ経由で遅延ロードせずに返すように変更できますか?

オブジェクト モデル(簡略化)

public class Schedule
{
    public int Id { get; set; }
    public Person Person { get; set; }
    public List<Class> Classes { get; set; }
}

public class Class
{
    public int Id { get; set; }
    public int Name { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public Schedule Schedule { get; set; }
    public List<FunFact> FunFacts { get; set; }
}   

public class FunFact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
}

マテリアライゼーション コード

var desiredPersonId = 42;
var classIds = new List<int> { 2, 3, 5, 7, 11 };
var schedule = (from sFilter in
                (from s in ctx.Schedules
                 where s.Person.Id == desiredPersonId
                 select new
                 {
                     Schedule = s,
                     Person = s.Person,
                     //FunFacts = s.Person.FunFacts,
                     Class = from c in s.Classes where classIds.Contains(c.Id) select c
                 }
                    ).AsEnumerable()
            select sFilter.Schedule).FirstOrDefault();
4

1 に答える 1

0

FunFactsのインスタンスとは関係なく、実際に選択されていることがわかりますSchedule

記事に触発されて、私は次の変更を加えることによって問題を解決しました:

var scheduleProjection = 
            (from s in ctx.Schedules
             where s.Person.Id == desiredPersonId
             select new
             {
                 Schedule = s,
                 Person = s.Person,
                 FunFacts = s.Person.FunFacts,
                 Class = from c in s.Classes where classIds.Contains(c.Id) select c
             }
                ).FirstOrDefault();

var schedule = scheduleProjection.Schedule;
schedule.FunFacts = scheduleProjection.FunFacts;
于 2012-07-16T22:31:35.573 に答える