Entity Framework объединить 3 таблицы


133

Я пытаюсь объединить три таблицы, но не могу понять метод ...

Я завершил соединение 2 столов

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

таблицы

Я хотел бы включить таблицу tbl_Title с TID PK и получить поле Title .

большое спасибо


Прочтите эту статью по теме. Он не использует обозначение метода, но вы сможете понять суть ... stackoverflow.com/questions/11204367/…
xspydr

Покажите картинку с расширенными свойствами навигации. Свойства навигации - это готовые объединения.
Герт Арнольд

Ответы:


202

Думаю, будет проще использовать синтаксический запрос:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

И вам, вероятно, следует добавить orderbyпункт, чтобы убедиться, что Top(10)возвращаются правильные десять элементов.


3
Большое спасибо за метод; работает ясно, но я хотел бы увидеть ответ, как я спросил, еще раз большое спасибо.
Erçin Dedeoğlu

@MarcinJuraszek: если мне нужна ViewModel для работы, нужно ли мне присоединяться к столам?
Vini

Это не работает даже без async. У меня есть точный сценарий, но запрос выдает исключение [the_list_of_all_return_variables] 'не может быть сериализован. @marcinJuraszek - Не могли бы вы взглянуть на stackoverflow.com/questions/42453123/…
sandiejat

1
ИДЕАЛЬНЫЙ! вы сэкономили мне столько времени :)
MohammadHossein R

81

Это не проверено, но я считаю, что синтаксис должен работать для лямбда-запроса. По мере того, как вы присоединяетесь к большему количеству таблиц с этим синтаксисом, вам необходимо углубляться в новые объекты, чтобы достичь значений, которыми вы хотите управлять.

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

17
Это ужасно. Если бы я когда-нибудь нашел такой запрос в производственном коде, я бы немедленно его реорганизовал. +1 за то, что ответил на заданный вопрос!
Дэн Бечард,

8
@Dan Из любопытства, это просто не продуманные соглашения об именах с помощью c, cm и ccm, или просто синтаксис, необходимый для выполнения соединений с использованием linq и lambda, ужасен? Если первое, и вы хотите отредактировать сообщение, чтобы иметь лучший макет, обязательно сделайте это. Я все еще новичок в структуре сущностей и все еще погружаюсь в лучшие практики, поэтому, если у вас есть предложения, чтобы сделать этот ответ более красноречивым для будущих пользователей, я был бы признателен за помощь.
Pynt

4
Я не особо задумывался о точной причине, когда комментировал, но, конечно, соглашения об именах ухудшают читаемость (очевидно, скопировано из OP). Кроме того, запятые в начале строки сильно ухудшают читабельность (для меня субъективно), а пробелы / отступы можно немного улучшить. Я отправил правку со всеми этими (ИМХО) улучшениями, так как вы ее запросили.
Дэн Бечард

2
Форматирование кода часто бывает необъективным, но есть общие вещи, которые, по мнению большинства, выглядят лучше. Что касается соглашений об именах, я обычно называл вещи очень короткими именами, но теперь я могу печатать достаточно быстро (даже не учитывая такие вещи, как Intellisense), чтобы несколько сохраненных символов не стоили ущерба читабельности по сравнению с подробным именованием вещей, например, "EntryID" vs. "EID", "commonEntry "vs." cm "и т. д. В конце концов, кто-то еще собирается прочитать мой код, и я бы предпочел, чтобы они не разжигали ненависть ко мне как линейную функцию от количества строк моего код, который им приходилось читать / поддерживать.
Дэн Бечард,

5
Я просто не понимаю аргументов против запятых в начале строки. Я твердо верю, так как это позволяет легко комментировать отдельные пункты / аргументы. И выглядит красивее :-)
Auspex
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.