Vấn đề là bạn đang kiểm tra Năm, Thành phố và QsNo trên OutPut
biến sau khi nối ... nhưng nếu OutPut là null (điều này sẽ xảy ra nếu không có hàng nào trong AllCosts) thì những kiểm tra này sẽ luôn là false, vì vậy cặp (mã, OutPut) sẽ bị lọc ra bởi mệnh đề where. EF phát hiện sự thật này và tạo một truy vấn hiệu quả hơn bằng cách chỉ sử dụng một phép nối bên trong.
Những gì bạn thực sự muốn làm là lọc ra các hàng ứng viên khỏi Chi phí, thay vì lọc trên các cặp (mã, chi phí). Để làm điều này, bạn có thể di chuyển bộ lọc của mình lên trên, vì vậy nó áp dụng trực tiếp vào bảng Chi phí:
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
};