以下の (簡略化された) オブジェクト モデルを考えるとSchedule
、特定の に対応するオブジェクトをロードする必要がありますが、人が取っているPerson
select のみをロードします。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();