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

Це не працює навіть без асинхронізації. У мене є точний сценарій, але запит кидає виняток [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, які є огидними? Якщо колишній, і ви хочете відредагувати публікацію, щоб вона була кращою компонуванням, явно не майте на ній. Я все ще не знайомий з організаційною базою, і все ще вникаю в передовий досвід, тому якщо у вас є пропозиції зробити цю відповідь красномовнішою для майбутніх користувачів, я буду вдячний за допомогу.
Пінт

4
Я не давав точної причини, що дуже замислювався, коли коментував, але, безумовно, конвенції про іменування зашкоджують читабельності (узагальнені копії з ОП). Крім того, коси як початок рядка сильно шкодять читабельності (для мене суб’єктивно), а пробіл / відступ можна трохи покращити. Я надіслав редагування з усіма цими вдосконаленнями (IMHO), оскільки ви подали запит на нього.
Ден Бешард

2
Форматування коду часто упереджене, але є загальні речі, з якими більшість людей згодні. Що стосується умов іменування, то я називав речі справді короткими іменами, але зараз я можу вводити досить швидко (навіть не враховуючи таких речей, як Intellisense), що кілька збережених символів не вартує шкоди для читабельності, а не для того, щоб називати речі дослівно, наприклад "EntryID" vs. "EID", "unitedEntry" vs. "cm" і т.д. Зрештою, хтось інший прочитає мій код, і я вважаю за краще, щоб вони не наробили ненависть до мене як лінійну функцію кількості рядків мого код, який їм довелося читати / підтримувати.
Ден Бешард

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