2011-04-14 18 views
0

こんにちは私は5つのテーブルを持っています。Linq-To-SQLの左外部結合問題

期間 同上 開始日終了日 IsDeleted

コード 同上 名前

YearlyTarget 同上 CodeId PeriodId YTAmountを次のように必要な関係があります は

AlteredTarget 同上 YearlyTargetId AltAmount IsDeleted

実際 同上 AlteredTargetId ActualAmount IsDeleted

私は年のデータでは4分の4を持っているIsDeleted。 YearlyTargetはすべての四半期に存在し、AlteredTargetはQ1、Actualは存在しません。次のように

私のクエリは次のとおりです。

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

私の推測では、それはあなたを台無しにしているwhereの句です。 cccaはnullでもかまわないことを忘れないでください。

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

はI既存のwhere句に対して潜在的によりよい代替置くことです:あなたはまた、あなたがにcccaを使用する投影を変更する必要があります

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

:にwhere句を変更してみてください参加へのIsDeletedのチェック:

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

と同じ 別のもの。実際の値がの場合はが存在するが、すべて削除されている場合、これはクエリの意味を変更することに注意してください。私はそれがあなたが行動をしたいものに変更すると思う...

+0

ありがとう、私の問題を解決した結合節で確認を追加します。 – Purusartha