0

给定下面的(简化的)对象模型,我需要加载Schedule对应于给定的对象,但只加载该人正在使用的Personselect 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();
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 回答