65

Я пытаюсь соединить три таблицы, но я не могу понять метод ...Entity Framework Присоединяйтесь 3 Таблицы

Я завершил присоединиться к 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); 

tables

Я бы как включить tbl_Title стол с TID PK и получить Название Поле.

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

+0

Проверьте эту статью на эту тему. Он не использует нотацию метода, но вы должны иметь возможность получить суть ... http://stackoverflow.com/questions/11204367/how-to-join-multiple-tables – Jason

+0

Пожалуйста, покажите картинку с расширенной навигацией свойства. Свойства навигации - это готовые соединения. –

+0

http://stackoverflow.com/questions/21759590/joining-two-tables-in-entity-framework http://stackoverflow.com/questions/11204367/how-to-join-multiple-tables – user3432436

ответ

111

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

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) возвращает правильные верхние десять пунктов.

+1

Спасибо очень много для метода; работает ясно, но я хотел бы получить ответ, как я спросил, спасибо много снова. –

+0

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

+0

Это не сработает, если вы хотите использовать async. – PJ7

39

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

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); 
+7

Это ужасно , Если бы я нашел такой запрос в производственном коде, я бы сразу его реорганизовал. +1 для ответа на заданный вопрос, хотя! – Dan

+3

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

+2

Я не задавал точной причине, когда я прокомментировал, но, конечно, соглашения об именах ухудшают читаемость (obv. Copy from from OP). Кроме того, запятые, как начало строки, значительно облегчают читаемость (субъективно, для меня), а пробелы/отступы могут быть немного улучшены. Я отправил изменения со всеми этими улучшениями (IMHO), так как вы его запросили. – Dan

0
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);   

                       Great answer 
Смежные вопросы