2010-01-14 4 views
0

У меня есть следующие модели и отношения:Linq - Получить значение из связанной присоединенной таблицы

Table: Granddad 
GranddadID 
GranddadName 

Table: Father 
FatherID 
GranddadID 
FatherName 

Table: Son 
SonID 
FatherID 
SonName 

в контроллере Дедушки:

public ActionResult Edit(int tmpgranddadid) 
{ 
    var q = (from g in _e.Grandad 
      where g.GrandadID == tmpgranddadid 
      select g).FirstOrDefault(); 

    string son_name = q.Father.Son.SonName.ToString(); // <- is wrong, how to do this? 

    return View(q); 
} 

Как получить значение из связной связанной таблицы ?

Спасибо

+0

Вы должны следовать рекомендациям по именованию. Просто сидение. –

+0

@Filip: Позаботьтесь о том, чтобы понять, я думаю, что существует множество правил именования, которые могут применяться здесь. – Lazarus

+1

У отца может быть более одного сына. Какой вы хотите? –

ответ

0

Предполагая, что источник данных выглядит следующим образом:

public class SomeDataSource 
{ 
    public List<Granddad> Granddad; 
    public List<Father> Father; 
    public List<Son> Son; 
} 

И предполагается, что вы на самом деле после первого внука за дедушкой то:

var firstGrandson = (from son in _e.Son 
       join father in _e.Father on son.FatherID equals father.FatherID 
       join granddad in _e.Granddad on father.GranddadID equals granddad.GranddadID 
       where granddad.GranddadID == tmpgranddadid 
       select son).FirstOrDefault(); 

if (firstGrandson == null) 
    throw new Exception("This granddad has no grandsons."); 

string son_name = firstGrandson.SonName; 

Это то, что вам нужно?

+0

Подождите секунду, я получил соединения прямо в этом? Черт возьми. – Codesleuth

+0

Просто протестировал его, работает нормально. – Codesleuth

+0

Дорогой Codesleuth. Спасибо за это :) Извините abit медленно, чтобы попробовать ваш пример Я действительно новый. Я устал от вашего кода, но когда мне нужно «присоединиться к отцу в _e.Father на сына.FatherID "Я не могу получить идентификатор FatherID. В моем представлении модели FatherID добр в" Свойствах навигации " – noobplusplus

1

Может быть, вы хотите какой-либо из, возможно, многих сыновей?

q.Fathers.First().Sons.First().SonName.ToString(); 

Будьте осторожны, потому что First() может выдать исключение, если у отца нет сыновей. Это будет обрабатывать этот случай:

string sonName = null; 
Father father = q.Fathers.FirstOrDefault(); 
if (father != null) { 
    Son son = father.Sons.FirstOrDefault(); 
    if (son != null) { 
     sonName = son.SonName.ToString(); 
    } 
} 
+0

LOL, thanks Mark :) Я уменьшил его и попытался. Однако я получил сообщение об ошибке: q.Fathers.First(). FatherName.ToString(). Ошибка: ссылка объекта не установлена ​​в экземпляр объекта. Пожалуйста, помогите :) Кроме использования First() есть ли другой способ, который я могу указать, чтобы указать [n] son ​​/ element? Я попытался использовать ElementAt (0), и я не знаю, как использовать AsQueryable, и все это не удалось :( Спасибо – noobplusplus

+0

Я обновил свой ответ, чтобы показать вам, как обрабатывать случай, когда у отца нет сыновей. –

+0

Возможно, вам захочется проверить, загружена ли ссылка с 'IsLoaded()' и 'Load()' при необходимости. – Wouter

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