Entity Framework 4.0 - Включая объекты - Проблема загрузки
У нас есть 3 таблицы в нашей базе данных, каждая из которых имеет сущность в нашем edmx. Чтобы проиллюстрировать мою проблему, представьте 3 таблицы:
Table: Make
Fields:
makeID
make
Table: Model
FIelds:
modelID
makeID foreign key
model
Table: Car
carID
modelID foreign key
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 таким образом, чтобы заполнить модель и заполнить автомобили (проблема с получением автомобилей, потому что у них нет свойства прямой навигации для создания)
Мы используем объекты 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, которая содержит всю эту информацию, так что я могу просто запросить этот один объект, но у меня продолжают появляться сообщения о том, что ключи должны быть сопоставлены... Я действительно сопоставил их на вкладке Mapping (Visual Studio 2010)... так что я снова пытаюсь заставить запрос работать.
1 ответ
Я не уверен на 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();