Как сделать левое соединение в рамках Entity? - PullRequest
2 голосов
/ 23 ноября 2010

Я новичок в Entity Framework и у меня возникли некоторые проблемы с запросом, который включает соединение.Вот модель, которую я использую:
http://img690.imageshack.us/img690/7132/modelow.png

Я хочу запросить все модели с включенной информацией для данного профиля (которую я получаю из информации об экземпляре).В качестве первого шага я пытаюсь получить все модели с включенной информацией, когда она существует (левое соединение), но это не удается.Я попробовал метод Join, но не могу даже скомпилировать.

var modelList = dc.db.models.Join(dc.db.profile_model,
                y => y.id,
                s => s.models.id,
                (y, s) => new Object( y.id, y.display, s.enabled, s.models, s.profiles )
                ))

MSDN об этой функции не соответствует тому, что дает мне intellisense, и у меня проблемы с параметрами.Я думаю, что первые 3 в порядке (2-я таблица и 2 ключа для присоединения), но я не могу правильно получить последний.Как я должен получить объект, который содержит все поля обеих моделей и profile_model?

Спасибо


Обновление:
Чтобы быть более понятным, вотзапрос, написанный на простом старом добром SQL:
select m.*, p.enabled from models m
left join profile_model p on m.id = p.model_id
where p.profile_id = 
(
  select profile_id from instances where instances.display = 'PTXM11602' 
)
or profile_id is null

Как он будет написан с использованием ef?

1 Ответ

2 голосов
/ 23 ноября 2010

Если я вас правильно понимаю, вам нужен список моделей с каждой моделью для всех экземпляров этой модели. Когда вы спроектировали свою модель правильно и у вас есть все правильные ссылочные ключи в базе данных, вы сможете написать что-то вроде этого:

var models =
    from model in db.models
    where (
        from pm in model.profile_models
        from instance in pm.profile.instances
        where instance.display == "PTXM11602").Any()
      ||
        !model.profile_models.Any()
    select model;

var results =
    from pm in db.profile_models
    where pm.profile.instances.Any(i => i.display == "PTXM11602")
    where models.Contains(pm.model)
    select new 
    {
        Model = pm.model,
        Enabled = pm.enabled
    };

Пожалуйста, прочитайте этот форум MSDN , чтобы заставить Contains метод работать с Entity Framework 3.5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...