Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Left Join Przetłumacz na wewnętrzne połączenie w Linq

Problem polega na tym, że sprawdzasz rok, miasto i QsNo na OutPut zmienna po złączeniu... ale jeśli OutPut ma wartość null (co miałoby miejsce, gdyby nie było wierszy w AllCosts), to te sprawdzenia zawsze będą fałszywe, więc para (kod, OutPut) zostanie odfiltrowana przez klauzulę where. EF wykrywa ten fakt i generuje zapytanie, które jest wydajniejsze po prostu przy użyciu sprzężenia wewnętrznego.

To, co naprawdę chcesz zrobić, to odfiltrować wiersze kandydatów z kosztów, zamiast filtrować według par (kod, koszt). Aby to zrobić, możesz przenieść filtr w górę, aby odnosił się bezpośrednio do tabeli Koszty:

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. Nazwa kolumny i/lub nazwa tabeli jako parametry

  2. Generowanie wierszy na podstawie wartości kolumny

  3. Lepszy sposób na sprawdzenie, czy dane już istnieją i wstawienie

  4. SQL Server:funkcje z wartościami przechowywanymi w tabeli a procedury składowane

  5. Subskrypcje oparte na danych SSRS Standard Edition 2008