我们的数据库中有 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 实体具有实体模型中的所有导航属性。延迟加载被禁用。我们希望能够将所有吉普大切诺基汽车都拉到我们的页面上。
现在我们的一个函数中有这样的东西 (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 已填充(获取 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)...因此我返回尝试使查询正常工作。
最佳答案
我不是 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();
关于c# - Entity Framework 4.0 - 包括实体 - 预加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118758/