Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tham gia bên trái Dịch sang tham gia bên trong trong Linq

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
                     };



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi tập kết quả từ SQL

  2. Chuyển mảng int sang proc được lưu trữ T-SQL thông qua khung thực thể

  3. xóa hàng khóa chính là khóa ngoại của bảng khác

  4. Tạo giá trị int ngẫu nhiên từ 3 đến 6

  5. RAISERROR ― Làm thế nào để phân biệt với SqlException?