2012-12-19 3 views
12

Je souhaite supprimer des lignes répétées d'un LISTE en utilisant distinct.Distinct ne fonctionne pas avec LINQ

C'est le resultset (Comme vous pouvez le voir, l'indice 12 et 14 sont répétées)

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 

C'est le sql Je veux archieve (ce fait le travail)

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 

C'est le LINQ Je suis en train d'adapter

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 
{ ... }; 

C'est ce que je suis en train:

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

Mais je reçois toujours les mêmes 7 lignes que s'il n'y a pas du tout DISTINCT.

Pourquoi?

+1

Est-ce que 'getDocIndex' mettre en œuvre 'IEquatable '? –

+4

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

+0

@Massimiliano Peluso A travaillé parfaitement. Merci –

Répondre

1

Essayez:

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

Je ne l'ai pas essayé, mais en regardant votre code me fait penser qu'il ne supprimera pas les doublons puisque chaque ligne aura bien sûr un ID qui correspond à la liste distincte des Id du même ensemble ..? –

+0

vous avez raison, le voir maintenant s'il vous plaît. J'ai eu ce problème avant et la seule façon que j'ai vu pour le résoudre était cette méthode – lante

+0

Cela fonctionnera. Cependant, la performance est pire que toutes les autres réponses suggérées, puisqu'elle itére sur la séquence 'docObj' * n * +1 fois, où * n * est le nombre d'identifiants distincts: s. Dites juste. Feliz Navidad, Nicolás. –

6

Si vous voulez que le Distinct effectué dans sql, appelez Distinct() avant 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

Malheureusement cela ne résout pas mon problème.Est-ce que je devrais écraser quelque classe pour le faire? Reste toujours les 7 Itens dans la liste –

+0

Est-ce que vous sélectionnez les mêmes colonnes à partir de votre instruction sql? – jrummell

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

Sur votre objet getDocIndex, vous devez implémenter l'interface IEquatable. Cela indiquera la méthode Distinct si vos objets sont égaux entre eux quand il fait une comparaison. C'est la bonne façon de faire des comparaisons avec Distinct et c'est beaucoup plus propre. Après avoir implémenté cette interface, vous pouvez continuer à appeler distinct et cela fonctionnera correctement.

+0

Mais cela n'affectera pas le SQL généré, ce qui semble être l'intention ici. – svick

+0

J'ai simplement répondu à sa question. "Je veux supprimer des lignes répétées d'un LISTE en utilisant distinct." "Mais je reçois toujours les mêmes 7 lignes comme s'il n'y avait pas DISTINCT du tout Pourquoi?" –

0

Chaque fois que vous utilisez sql, utilisez .Distinct() avant .ToList(). Cela va probablement résoudre le problème. Par exemple:

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

Distinct ne fonctionne que Lambda ..like ce

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

si nous voulons supprimer les doublons dans la requête LINQ ..use groupe

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();