实体框架4.0 - 包括实体 - 渴望加载问题

时间:2010-06-25 14:23:09

标签: c# entity-framework include navigation objectset

我们的数据库中有3个表,每个表在我们的edmx中都有一个实体。为了说明我的问题,想象3个表:

Table: Make
Fields:
makeID
make

Table: Model
FIelds:
modelID
makeID    foreign key
model

Table: Car
carID
modelID   foreign key
car

我们的Make,Model和Car实体拥有实体模型中的所有导航属性。延迟加载已禁用。我们希望能够将所有Jeep Grand Cherokees的车辆输出到我们的页面。

现在我们在其中一个函数(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 car表以便我们的函数返回Make实体对象,以便填充模型并且Cars是填充(获取汽车的问题因为他们没有直接导航属性来制作)

我们正在使用POCO对象。

目标是让1个函数返回一个Make实体来执行此操作:

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)...所以我回过头来尝试使查询正常工作。

1 个答案:

答案 0 :(得分:2)

我不是百分百肯定,但我相信你需要创建这样的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 => @t.@t.mk.make == "Jeep" && @t.@t.mo.model == "Grand Cherokee")
        .Select(@t => new MakeModelCarDto
        {
            Makes = @t.@t.mk,
            Model = @t.@t.mo,
            Cars = @t.c
        }).SingleOrDefault();