Il blog di Sandro Rizzetto

Inner join con due o piú campi in Linq to Sql

 

Visto che dalle statistiche questo post sulla Left Outer Join in Linq to Sql è uno dei più letti, ne posto un altro sulla inner join a due o più condizioni (che piú che altro serve a me come reminder in futuro).

Supponiamo di avere una tabella fornitori la cui chiave sia Società+Codice e di volerla "joinare" (bleahh) con un'altra che ha la stessa chiave. Visto che la sintassi join...in...on...equals di C# 3.0 non permette l'utilizzo dell' && (and) seconda condizione si usa il "trucco" di confrontare due anonymous type uguali, ovvero:

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { s.idCompany, s.idSupplier } equals new { j.idCompany, j.idSupplier }
   select new {  j.SupplierName, s.QualifyStartDate };

Purtroppo non sempre i campi nelle due tabelle si chiamano uguali e dato che i 2 anonymous type devono invece esserlo, se non vogliamo beccarci un eccezione del tipo "the type of one of the expressions in the join clause is incorrect.  type inference failed in the call to 'join'." dobbiamo usare degli alias

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { SOC = s.idCompany, CODE = s.idSupplier } equals new { SOC = j.ErpSoc, CODE = j.ErpCode }
   select new {  j.SupplierName, s.QualifyStartDate };

Infine se nel DB i campi non sono dello stesso tipo (come era il mio caso in cui Suppliers veniva da una tabella Oracle del gestionale e SupplierInfos da una mia tabella SqlServer) bisogna castarli per renderli omogenei.

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { SOC = (char)s.idCompany, CODE = (int)s.idSupplier} equals new { SOC = (char)j.ErpSoc, CODE = (int)j.ErpCode }
   select new {  j.SupplierName, s.QualifyStartDate };

Aggiungi Commento

Copyright © 1997-2017 Sandro Rizzetto | All Rights Reserved | Riproduzione delle fotografie vietata | Powered by me