61 messaggi dal 20 maggio 2009
ciao,

ho la necessità di fare una query linq utilizzando il comando Except()
devo quindi implementare una classe che implementi IEqualityComparer.

Tutti gli esempi che ho trovato mostrano come confrontare 2 oggetti dello stesso tipo, ma nel mio caso devo confrontare 2 oggetti diversi.

obj1.CodiceCliente == obj2.CODCLIUTE

é possibile fare un EqualityComparer con 2 oggetti differenti ?

Vivaldi Francesco
11.886 messaggi dal 09 febbraio 2002
Contributi
artanis ha scritto:
é possibile fare un EqualityComparer con 2 oggetti differenti ?


ciao, purtroppo no. La definizione di Except contempla solo un tipo quindi, volendo usare questo sistema, sei obbligato a proiettare il secondo tipo sul primo usando il metodo .Select. Cioè, potresti fare:
var query = listaObj1.Except(listaObj2.Select(obj2 => new Obj1 { CodiceCliente = obj2.CODCLIUTE }), new TuoComparer());

...ma non è che mi piaccia molto come soluzione quella di istanziare tanti Obj1 al solo fine di ottenere una corrispondenza di tipo. Così mi sembra di voler usare .Except a tutti i costi, anche se non è idoneo a questo caso specifico.

Invece potresti scrivere un tuo extension method .Except che supporti due tipi. Si rivelerebbe utile se la tua applicazione ne dovesse fare un utilizzo abbastanza frequente.
In alternativa, la soluzione più semplice è questa query, che simula il comportamento di Except.
var query = from obj1 in listaObj1
                    where !listaObj2.Any(obj2=>obj2.CODCLIUTE == obj1.CodiceCliente)
                    select obj1;

In questo modo seleziono solo quei obj1 il cui CodiceCliente non corrisponde ad alcun CODCLIUTE nella lista2.
Ho usato il metodo .Any che restituisce un valore booleano che mi dice, appunto, se è stato trovato un qualsiasi elemento rispondente al predicato che è stato passato come parametro.

ciao,
Modificato da BrightSoul il 25 ottobre 2011 21.51 -

Enjoy learning and just keep making
61 messaggi dal 20 maggio 2009
Ciao,
grazie della risposta.

Sono riuscito a risolvere in questo modo:
  var Result2 = ( from a in RepositoryProposte.GetAll()
            where !(from y in Result select y.CodiceCliente).Contains(a.OPECODCLIUTE)


in pratica ho negato il contains.
devo ancora verificare che la nuova query linq dia lo stesso risultato della query originale in sql, ma dovrebbe anadre bene.

Vivaldi Francesco

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.