Het probleem is dat u het jaar, de stad en het QsNo controleert op de OutPut
variabele na de join... maar als OutPut null is (wat zou gebeuren als er geen rijen in AllCosts zijn), dan zijn deze controles altijd onwaar, dus het paar (code, OutPut) wordt uitgefilterd door de waar-clausule. EF detecteert dit feit en genereert een query die efficiënter is door alleen een inner join te gebruiken.
Wat u echt wilt doen, is kandidaatrijen uit Kosten filteren, in plaats van te filteren op (code, kosten)paren. Om dit te doen, kunt u uw filter naar boven verplaatsen, zodat het rechtstreeks van toepassing is op de tabel Kosten:
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
};