2010-06-25 184 views
2

我们在我们的db中有3个表,每个表都在我们的edmx中有一个实体。为了说明我的问题,想象3个表格:实体框架4.0 - 包括实体 - 急切的加载问题

Table: Make 
Fields: 
makeID 
make 

Table: Model 
FIelds: 
modelID 
makeID foreign key 
model 

Table: Car 
carID 
modelID foreign key 
car 

我们的Make,Model和Car实体具有实体模型中的所有导航属性。延迟加载被禁用。我们希望能够将所有吉普大切诺基车都输出到我们的页面。

现在我们有这样的事情在我们的功能之一(C#4.0)

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Where(mk => mk.make == "Jeep").ToList()); 

_makeRepository.GetQuery()返回IQueryable ......我们实现存储库模式

这个查询应该工作正常(避风港没有对它进行测试,但是我们如何才能.Include车表,以便我们的函数返回Make实体对象,以便模型被填充并且Cars被填充(获取Cars的问题,因为它们没有直接导航财产制造)

我们使用POCO对象。

的目标是有1个函数返回一个制作实体能够做到这一点:

foreach(Make myMake in makeList) 
{ 
    Response.Write(myMake.make); 

    foreach(Model myModel in myMake.Models) 
    { 
     Response.Write(myModel.model); 

     foreach(Car mycar in myModel.Cars) 
     { 
       Response.Write(mycar.car); 
     } 
    } 
} 

像这样的事情似乎并不可能,但它就是我们将用于:

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Include(c => mk.Models.Cars) 
     .Where(mk => mk.make == "Jeep").ToList()); 

我也试过在我的edmx中创建一个包含所有这些信息的新实体,这样我就可以查询那个对象,但是我不停地收到错误,指出键必须被映射......我没有将它们映射到映射中选项卡(Visual Studio 2010)...所以我回来试图让查询工作。

回答

2

我不是100%肯定,但我相信你会需要创造一些像这样的DTO的:

public MakeModelCarDto 
{ 
    public IEnumerable<Make> Makes {get; set;} 
    public IEnumerable<Model> Models {get; set;} 
    public IEnumerable<Car> Cars {get; set;} 
} 

然后,你将不得不加入这样的表:

_makeRepository.GetQuery() 
     .Join(_modelRepository.GetQuery(), mk => mk.makeid, mo => mo.makeid, (mk, mo) => new { mk, mo }) 
     .Join(_carRepository.GetQuery(), @t => @t.mo.modelid, c => c.modelid, (@t, c) => new { @t, c }) 
     .Where(@t => @[email protected] == "Jeep" && @[email protected] == "Grand Cherokee") 
     .Select(@t => new MakeModelCarDto 
     { 
      Makes = @[email protected], 
      Model = @[email protected], 
      Cars = @t.c 
     }).SingleOrDefault();