Entity Framework 4.0 - Включая объекты - Проблема загрузки - PullRequest
2 голосов
/ 25 июня 2010

У нас есть 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 таблица машинытак что наша функция возвращает объекты 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 Ответ

2 голосов
/ 02 августа 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();
...