2017-02-02 6 views
2

Мне нужно объединить 5 таблиц в запросе. 3 из этих таблиц должны иметь отношения, но два из них необязательно связаны с записью.Entity Framework/LINQ: Left join defaultifempty failed

Из-за этого, я пытаюсь сделать LEFT JOIN к Table4 и Table5 так:

var cDesc = (cDesc == null ? "" : cDesc); 
var cStreet = (cStreet == null ? "" : cStreet); 

var q = await (from t1 in MyContext.Table1 

      join t2 in MyContext.Table2 
      on t1.ID equals t2.ObjectID 

      join t3 in MyContext.Table3 
      on t2.TeamID equals t3.TeamID 

      join t4 in MyContext.Table4 
      on t1.ID equals t4.ObjectID 
      into join3 

      from j3 in join3.DefaultIfEmpty() 
      join t5 in MyContext.Table5 
      on j3.StorageID equals t5.StorageID 

      where t2.ObjectType.Equals(16) 
      && t3.UserID.Equals(userID) 
      && t1.Description.Contains(cDesc) 
      && l.Address.Contains(cStreet) 

      orderby t1.ID descending 

      select new Table1ListModel 
      { 
       ID = t1.ID, 
       Description = t1.Description, 
       Address = t5.Address 
      } 

      ) 
      .Take(takeThis) 
      .ToListAsync(); 

Но этот запрос работает только для строк, который имеет подключение к Table4, так что я делаю что-то неправильно очевидно.

Я правильно делаю соединение? Или проблема в том, что я хочу запустить where по адресу, который поступает из пятой таблицы?

+0

Если все стыки основаны на foriegn ключевые отношения, вы обнаружите, что использование свойств навигации, которые предоставляет EF, будет менее беспорядочным, чем использование объединений https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

ответ

3

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

from j3 in join3.DefaultIfEmpty() 
join temp5 in MyContext.Table5 
    on j3.StorageID equals temp5.StorageID into join4 
from t5 in join4.DefaultIfEmpty() 
+0

Спасибо, сэр за помогая нолу! –

0

Это выглядит как источник вашей проблемы:

join t4 in MyContext.Table4 
on t1.ID equals t4.ObjectID 
into join3 

Это означает, что вы внутреннее присоединение table4 к Table1

+0

На самом деле это объединение групп, а следующий 'DefaultIfEmpty' приведет к левому соединению. Проблема заключается в следующем внутреннем соединении из таблицы 4 в таблицу5, которая в основном отменяет предыдущее левое соединение. – juharr