Проблема с левым внешним соединением в Linq-To-Sql - PullRequest
0 голосов
/ 14 апреля 2011

Привет, у меня 5 столов. Необходимые отношения следующие:

Период Я бы Дата начала Дата окончания IsDeleted

Код Я бы Имя

YearlyTarget Я бы CodeId PeriodId YTAmount IsDeleted

AlteredTarget Я бы YearlyTargetId AltAmount IsDeleted

Фактический Я бы AlteredTargetId Фактическая сумма IsDeleted

У меня есть 4 квартала в данных за год. Годовая цель существует для всех кварталов, AlteredTarget для первого квартала и Фактическая для всех.

Мой запрос выглядит следующим образом:

from cl in this.Context.Codes    
join ytl in this.Context.YearlyTargets on cl.Id equals ytl.CodeId    
join pl in this.Context.Periods on ytl.PeriodId equals pl.Id    
join atl in this.Context.AlteredTargets on ytl.Id equals cdpl.YearlyTargetId into ccl    
join al in this.Context.Actuals on ytl.Id  equals al.AlteredTargets.YearlyTargetId into cal   
from cc in ccl.DefaultIfEmpty()    
from ca in cal.DefaultIfEmpty()
where cc.IsDeleted == false && ca.IsDeleted == false   
select new    
{    
    Year = pl.EndDate.Year,    
    PeriodType = (PeriodType)pl.PeriodType,    
    PeriodName = pl.StartDate,    
    CodeName = cl.CodeName,    
    YT = ytl.TargetAmount,    
    CDP = cc.AltAmount,    
    Actual = ca.ActualAmount    
};

запрос возвращается пустым. Может кто-нибудь подскажите, пожалуйста, что не так с запросом. Спасибо !!!

1 Ответ

1 голос
/ 14 апреля 2011

Я предполагаю, что это пункт where, который вводит вас в заблуждение.Не забывайте, что cc и ca могут быть нулевыми.Попробуйте изменить предложение where на:

where (cc == null || !cc.IsDeleted) && (ca == null || !ca.IsDeleted)

Затем вам также может понадобиться изменить проекции, в которых вы используете cc и ca, на:

CDP = cc == null ? 0 : cc.AltAmount,    
Actual = ca == null ? 0 : ca.ActualAmount

I потенциальноЛучшая альтернатива существующему предложению where состоит в том, чтобы поместить в объединение проверку для IsDeleted:

join al in this.Context.Actuals.Where(x => !x.IsDeleted) 
  on ytl.Id  equals al.AlteredTargets.YearlyTargetId into cal

и то же самое для другого.Обратите внимание, что это меняет смысл запроса, если существуют фактические значения do , но все они удалены.Я подозреваю, что это меняет то, что вы хотите, чтобы поведение было, хотя ...

...