10 giugno 2009 11:47
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 };