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();
Другие вопросы по тегам