問題は、OutPut
で Year、City、および QsNo をチェックしていることです。 結合後の変数...ただし、OutPut が null の場合 (AllCosts に行がない場合に発生します)、これらのチェックは常に false になるため、ペア (コード、OutPut) は where 句によって除外されます。 EF はこの事実を検出し、内部結合を使用するだけでより効率的なクエリを生成します。
本当にやりたいことは、(コード、コスト) ペアでフィルタリングするのではなく、Costs から候補行を除外することです。これを行うには、フィルターを上に移動して、Costs テーブルに直接適用することができます:
var Result = from code in ent.ProductCodes
join cost
in ent.Costs.Where(c => c.Year == Year && c.City == City && c.QsNo == Qsno)
on new { code.Year, code.Code } equals new { cost.Year, cost.Code }
into AllCosts
from OutPut in AllCosts.DefaultIfEmpty()
where code.PageNo == PageNo
select new
{
ProductCode = code.Code
Col6 = OutPut.Price
};