给定下面的(简化的)对象模型,我需要加载Schedule
对应于给定的对象,但只加载该人正在使用的Person
select es。Class
我正在使用投影来实现这一点,并且效果很好(除了 EF Profiler 抱怨连接过多)。
现在我有一个新的要求也加载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();