Masalahnya adalah Anda memeriksa Tahun, Kota, dan QsNo pada OutPut
variabel setelah bergabung... tetapi jika OutPut adalah null (yang akan terjadi jika tidak ada baris di AllCosts) maka pemeriksaan ini akan selalu salah, sehingga pasangan (kode, Keluaran) akan disaring oleh klausa where. EF mendeteksi fakta ini dan menghasilkan kueri yang lebih efisien hanya dengan menggunakan gabungan dalam.
Yang benar-benar ingin Anda lakukan adalah memfilter baris kandidat dari Biaya, daripada memfilter pasangan (kode, biaya). Untuk melakukan ini, Anda dapat memindahkan filter ke atas, sehingga berlaku langsung ke tabel Biaya:
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
};