2017-11-03 35 views
0

右のSalesテーブルにレコードがなく、またSales.Fallthrough == false && Sales.Date == nullの場合にのみ、データを返そうとしているlinqクエリがあります。C#Linq左外側結合WHERE句

これは私のクエリの基本であり、私はこれで多くの異なることを試しましたが、必要なデータを返すことができませんでした。私が試したものは、Salesがない場合、またはWERE caluseと一致していても両方ではない場合にのみ、レコードを返すようです。

from cr in efContext.Cases 
join si in efContext.Sales on cr.CaseId equals si.CaseId into sicr 
from sicr in (from si in sicr 
       where si == null 
       select si 
       ).DefaultIfEmpty() 
where cr.Withdrawn == false 
    select new 
    { 
     CaseId = cr.CaseId, 
     PropertyAddress = extension.PropertyAddressTownFormat(cr.PropertyAddress1, cr.PropertyTown), 
     TargetExchangeDate = sicr.TargetExchangeDate == null ? null : sicr1.TargetExchangeDate, 
     ActualExchangeDate = sicr.ActualExchangeDate, 
    }).ToList(); 

EDIT はほとんど情報を逃しました。 Salesにレコードがありますが、WHERE句と一致しない場合は、レコードがないかのように左側と右側が返されます。

ありがとうございました。

+0

私はそれを見ましたが、私のクエリはそれに基づいていますが、必要なデータは返されません。私は少しの情報が欠けているので、質問を編集しました。 – JBoom

+0

「セールスにレコードがありますが、WHERE句と一致しない場合はどうしますか?」とはどういう意味ですか? '' cr.Withdrawn == false''の場合、クエリが結合プロダクトを返すべきであることを意味しますか? – oddparity

+0

ごめんなさい。したがって、「営業」にレコードがない場合は、「ケース」からすべてのレコードを戻す必要があります。 'Sales'にレコードがあれば' WHERE'節をフィルタリングします 'Sales.Fallthrough == false && Sales.Date == null'しかし、WHERE節と一致しなければレコードを返します「事件」。それは理にかなっていますか? – JBoom

答えて

0

それだけでは...ですか?

from cr in efContext.Cases 
join si in efContext.Sales on cr.CaseId equals si.CaseId into sicr 
from s in sicr.DefaultIfEmpty() 
select new 
{ 
    CaseId = cr.CaseId, 
    PropertyAddress = extension.PropertyAddressTownFormat(cr.PropertyAddress1, cr.PropertyTown), 
    TargetExchangeDate = s == null || (s.Fallthrough == false && s.Date == null) ? null : s.TargetExchangeDate, 
    ActualExchangeDate = s == null || (s.Fallthrough == false && s.Date == null) ? null : s.ActualExchangeDate, 
}; 

クエリが匿名型を返すため、ToListを呼び出すことはできません。

+0

これは、 'Sale'があるが' s.Fallthrough == false && s.Date == null'と一致しない 'Cases'を返すとは思わない。 – JBoom

+0

それはどう? – oddparity