2012-07-11 72 views
0

鉴于(简体)对象下的模式,我需要加载对应于给定PersonSchedule对象,但只加载选择Class ES该人正在采取。实体框架投影:Materialise的补充名单

我完成了使用投影,它工作正常(除了EF分析器抱怨太多的联接)。

现在我有一个新的要求,也加载​​。我希望注释掉的代码//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(); 

回答

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; 

通过an article启发,我通过进行以下更改解决问题