2016-01-04 1 views
3

Ниже вы можете найти мою проблему. Мой вид петля только через данные, когда оба «DocentenCompetenties» и «DocentenLocaties» заполняются. Это problen, потому что я хочу, чтобы иметь возможность цикл их, даже если один из них doens't есть какие-либо данныеLinq Joins работает только при наличии всех таблиц

var ShowCompetenties = from d in db.Docent 
     join dc in db.DocentenCompetenties on d.DocentID equals dc.DocentID 
     join c in db.Competenties on dc.CompetentiesID equals c.CompetentiesID 
     join dl in db.DocentenLocaties on d.DocentID equals dl.DocentID 
     where d.DocentID == id 
     join l in db.Locaties on dl.LocatieID equals l.LocatieID 
     select new ShowCompetenties { Docenten = d, Competenties = c, DocentenCompetenties = dc, DocentenLocaties = dl, Locaties = l }; 

ОБНОВЛЕНИЕ

Текущий Ошибка: исключение типа «System.NullReferenceException» произошло в App_Web_xp01otas.dll, но не был обработан в пользовательском коде Дополнительная информация: ссылка на объект не указывает на экземпляр o ▪ Таблица.

var id = Convert.ToInt32(Session["id"]); 
    var LeftShowCompetenties = from d in db.Docent 
     join g1 in db.DocentenCompetenties on d.DocentID equals g1.DocentID into group1 
     from dc in group1.DefaultIfEmpty()          
     join c in db.Competenties on dc.CompetentiesID equals c.CompetentiesID 
     where d.DocentID == id       
     select new ShowCompetenties { Docenten = d, Competenties = c, DocentenCompetenties = dc}; 


    var RightShowCompetenties = from d in db.Docent           
     join g3 in db.DocentenLocaties on d.DocentID equals g3.DocentID into group3  from dl in group3.DefaultIfEmpty() 
     where d.DocentID == id 
     join l in db.Locaties on dl.LocatieID equals l.LocatieID 
     select new ShowCompetenties { Docenten = d, Locaties = l, DocentenLocaties = dl }; 



    var ShowCompetenties = LeftShowCompetenties.Union(RightShowCompetenties); 

VIEW

<h4>Competenties</h4> 
@foreach (var item in Model) 
{ 
      if(@item.DocentenCompetenties != null && @item.DocentenCompetenties.DocentID.ToString() != null) { 
      @item.Competenties.Name @Html.ActionLink("Delete", "DeleteCompetenties", new { id = item.DocentenCompetenties.DocentenCompetentiesID }) 
} 

<h4>Docenten</h4> 
@foreach (var item in Model) 
{ 
     if(@item.DocentenLocaties != null && @item.DocentenLocaties .DocentID.ToString() != null) 
     { 
      @item.Locaties.Name 
     } 
} 
+0

Посмотрите на [DefaultIfEmpty] (https://msdn.microsoft.com/library/bb360179 (v = VS.100) .aspx) – strickt01

+0

им работать с @foreach (элемент var в ** Model **) {@ item.Locaties.Name} Я пытаюсь, но это не удалось. Должен ли я переписать запрос? –

+0

Говорят, если вам нужно делать соединения в LINQ, что-то, вероятно, неверно - по крайней мере, между сущностями отсутствует связь. В худшем случае LINQ используется как альтернатива SQL (это не так), и все соединение должно быть заменено на VIEW. По крайней мере, создайте ** правильные отношения ** в вашей модели/сопоставлении. –

ответ

3

Вы делаете внутреннее соединение таким образом.

Похоже, вы действительно хотите сделать внешнее соединение. Попробуйте это:

var ShowCompetenties = from d in db.Docent 
    join g1 in db.DocentenCompetenties on d.DocentID equals g1.DocentID into group1 
    from dc in group1.DefaultIfEmpty() 

    join g2 in db.Competenties on dc.CompetentiesID equals g2.CompetentiesID into group2 
    from c in group2.DefaultIfEmpty() 

    join g3 in db.DocentenLocaties on d.DocentID equals g3.DocentID into group3 
    from dl in group3.DefaultIfEmpty() 

    where d.DocentID == id 
    join l in db.Locaties on dl.LocatieID equals l.LocatieID 
    select new ShowCompetenties { Docenten = d, Competenties = c, DocentenCompetenties = dc, DocentenLocaties = dl, Locaties = l }; 

Это только левое внешнее соединение, однако, если вы хотите сделать полное внешнее соединение. Сначала вы должны сделать левое, затем правое внешнее соединение и, наконец, слить (с Union()) два.

EDIT Согласно комментариям, касаемо ошибки вы получаете после UNION:

var id = Convert.ToInt32(Session["id"]); 
     var LeftShowCompetenties = from d in db.Docent 
      join g1 in db.DocentenCompetenties on d.DocentID equals g1.DocentID into group1 
      from dc in group1.DefaultIfEmpty()          
      join c in db.Competenties on dc.CompetentiesID equals c.CompetentiesID 
      where d.DocentID == id       
      select new ShowCompetenties { Docenten = d, Competenties = c, Locaties = null, DocentenCompetenties = dc, DocentenLocaties = null}; 


    var RightShowCompetenties = from d in db.Docent           
      join g3 in db.DocentenLocaties on d.DocentID equals g3.DocentID into group3 
      from dl in group3.DefaultIfEmpty() 
      where d.DocentID == id 
      join l in db.Locaties on dl.LocatieID equals l.LocatieID 
      select new ShowCompetenties { Docenten = d, Competenties = null, Locaties = l, DocentenCompetenties = null, DocentenLocaties = dl }; 



    var ShowCompetenties = LeftShowCompetenties.Union(RightShowCompetenties); 

(Проверьте добавляемые Locaties = null и Competenties = null в конструкторах.)

VIEW

if (@item.DocentenCompetenties != null){} 
if (@item.DocentenLocaties!= null){} 
+0

. Проверьте это: https://msdn.microsoft.com/en-us/library/bb397908.aspx. Это дает еще несколько объяснений обо всем этом. И для создания правильного соединения: вы в основном переключаете таблицы вокруг своих объединений. Есть много примеров, если вы хотите получить более подробную информацию. –

+0

Тип «DocentenAlumniAPP.Models.ShowCompetenties» появляется в двух структурно несовместимых инициализациях в одном запросе LINQ to Entities. Ошибка, которую я получаю при выполнении примеров –

+0

. Похоже, что конструктор в вашем выборе отличается в левом соединении с правым соединением. (Эта ошибка обычно возникает во время 'United()'). Можете ли вы опубликовать свой полный запрос? –

1

Если у вас есть навигационная система от свойств созданных, это гораздо проще налево присоединиться:

var ShowCompetenties = 
    from d in db.Docent 
    where d.DocentID == id 
    from dc in d.DocentenCompetenties.DefaultIfEmpty() 
    let c = dc.Competenty 
    from dl in d.DocentenLocaties.DefaultIfEmpty() 
    let l = dl.Locaty 
    select new ShowCompetenties { 
    Docenten = d, 
    Competenties = c, 
    DocentenCompetenties = dc, 
    DocentenLocaties = dl, 
    Locaties = l }; 
+0

** Объединение, с которым я работаю, я думаю, что я просто борюсь с этой ошибкой ** Исключение типа «System.NullReferenceException» произошло в App_Web_q05ilzt1.dll, но не было обработано в коде пользователя –

+0

@SaraBarreraRiano, если вам нужно используйте объединения, тогда отображение LINQ будет нарушено. Нет никакой пользы в использовании ORM, если вам нужно вручную использовать объекты объединения, но это * * вызывает много проблем. Код отношения распространяется на все контроллеры в форме объединений, когда это должно быть несколько строк кода в конфигурация DbContext –

+0

Итак, это лучшее решение? –

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