2012-12-19 15 views
12

Desidero rimuovere le righe ripetute da un ELENCO utilizzando distinto.Distinto non funziona con LINQ

Questa è la di risultati (Come si può vedere, indice di 12 e 14 si ripetono)

id idIndice idName   idTipo tamanho  caminho 
12 11   Processo  3  10   C:\Program Files\Empenho\Senha.txt 
13 13   Endereço  1  250   C:\Program Files\Empenho\Senha.txt 
14 12   Número   2  5   C:\Program Files\Empenho\Senha.txt 
15 9   Cep   5  8   C:\Program Files\Empenho\Senha.txt 
16 10   Dt. de Nasc. 4  0   C:\Program Files\Empenho\Senha.txt 
12 11   Processo  3  10   C:\Program Files\Empenho\Senha.txt 
14 12   Número   2  5   C:\Program Files\Empenho\Senha.txt 

Questa è la sql voglio archieve (questo fa il lavoro)

select DISTINCT u.id, u.idIndice, t.idName, t.idTipo, t.tamanho, l.caminho 
from tgpwebged.dbo.sistema_Indexacao as u 
join tgpwebged.dbo.sistema_Indexes as t on u.idIndice = t.id 
join tgpwebged.dbo.sistema_Documentos as l on u.idDocumento = l.id 
join tgpwebged.dbo.sistema_DocType_Index as v on t.id = v.indexId 
where u.idDocumento = 10 

Questa è la LINQ sto cercando di adattarsi

var docObj = from u in context.sistema_Indexacao 
join t in context.sistema_Indexes on u.idIndice equals t.id 
join l in context.sistema_Documentos on u.idDocumento equals l.id 
join v in context.sistema_DocType_Index on t.id equals v.indexId 
join m in context.sistema_DocType on v.docTypeId equals m.id 
where u.idDocumento == id 
select new Gedi.Models.OperacoesModel.getDocIndex 
{ ... }; 

questo è quello che sto cercando:

List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModelDup = docObj.ToList(); 
List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModel = 
docIndexModelDup.Distinct().ToList(); 

Ma ho ancora gli stessi 7 righe, come se non v'è alcun DISTINCT a tutti.

Perché?

+1

Ha 'getDocIndex' implementare 'IEquatable '? –

+4

http://blog.jordanterrell.com/post/LINQ-Distinct%28%29-does-not-work-as-expected.aspx –

+0

@Massimiliano Peluso Ha funzionato perfettamente. Grazie –

risposta

1

Prova:

var distinctRowsById = docObj.Select(i => i.Id) 
    .Distinct() 
    .Select(i => docObj.First(o => o.Id == i) 
+5

Non l'ho provato, ma guardando il tuo codice mi viene in mente che non rimuoverà i duplicati poiché ogni riga avrà ovviamente un ID che corrisponde all'elenco distinto di Id dello stesso set ..? –

+0

hai ragione, vederlo ora per favore. Ho avuto questo problema prima e l'unico modo in cui ho visto di risolverlo era questo metodo – lante

+0

Che funzionerà. Tuttavia, la performance è peggiore di tutte le altre risposte suggerite, poiché itera sulla sequenza 'docObj' * n * +1 volte, dove * n * è il numero di id distinti: s. Basta dire. Feliz Navidad, Nicolás. –

6

Se si desidera che il Distinto eseguita in SQL, chiamare distinti() prima ToList().

var docObj = (from u in context.sistema_Indexacao 
    join t in context.sistema_Indexes on u.idIndice equals t.id 
    join l in context.sistema_Documentos on u.idDocumento equals l.id 
    join v in context.sistema_DocType_Index on t.id equals v.indexId 
    join m in context.sistema_DocType on v.docTypeId equals m.id 
    where u.idDocumento == id 
    select new Gedi.Models.OperacoesModel.getDocIndex 
    { ... }).Distinct().ToList(); 
+0

Sfortunatamente questo non risolve il mio problema.Devo sovrascrivere qualche lezione per farlo? Rimangono le 7 iten nella lista –

+0

Stai selezionando le stesse colonne dall'istruzione sql? – jrummell

5
var docIndexModel = docIndexModelDup 
    .GroupBy(x => x.Id) 
    .Select(g => g.First()); 
0

sul vostro oggetto getDocIndex, è necessario implementare l'interfaccia IEquatable. Questo dirà il metodo distinto se i vostri oggetti sono uguali tra loro quando lo fa un confronto. Questo è il modo corretto per fare confronti con Distinct ed è molto più pulito.

Dopo aver implementato questa interfaccia, è possibile continuare a chiamare distinte e funzionerà correttamente.

+0

Ma questo non influenzerà l'SQL generato, che sembra essere l'intenzione qui. – svick

+0

Ho semplicemente risposto alla sua domanda. "Voglio rimuovere le righe ripetute da un ELENCO usando distinte." "Ma ottengo ancora le stesse 7 righe come se non ci fosse affatto DISTINCT Perché?" –

0

Ogni volta che si utilizza sql, utilizzare .Distinct() prima di .ToList(). Questo probabilmente risolverà il problema. Per esempio:

opere
var ans = (from x in xyx 
      where ... 
      select new ... 
      { 
       a = ..., 
       b = ... 
      }).Distinct().ToList(); 
0

distinti solo Lambda ..like questo

var data =_CustomerCompanyRepository.GetAll().Where(p => (p.PrimaryUser == userid || p.SecondayUser == userid)).Distinct(); 

Se vogliamo rimuovere i duplicati di query LINQ ..use gruppo

var Account = (from c in depa join u in UserManager.Users on c.Id equals u.DepartmentId 
           group c by c into g 
           select new datadto{ Id = g.Key.Id, Name = g.Key.DepatmentName }).ToArray();