代码之家  ›  专栏  ›  技术社区  ›  Chris Klepeis

实体框架4.0-包括实体-急切加载问题

  •  2
  • Chris Klepeis  · 技术社区  · 16 年前

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

    Table: Make
    Fields:
    makeID
    make
    
    Table: Model
    FIelds:
    modelID
    makeID    foreign key
    model
    
    Table: Car
    carID
    modelID   foreign key
    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 car表,以便我们的函数返回Make实体对象,从而填充模型和汽车(获取汽车时出现问题,因为它们没有要生成的直接导航属性)

    我们使用的是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());
    

    1 回复  |  直到 16 年前
        1
  •  2
  •   Paul    16 年前

    我不是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 => @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();
    
    推荐文章