2012-12-19 15 views
12

Chcę usunąć powtarzające się wiersze z LISTY używając odmiennego.Wyraźne nie działa z LINQ

To resultset (Jak widać, indeks 12 i 14 są powtarzane)

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 

To sql Chcę Archiwum (ta spełnia swoje zadanie)

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 

to LINQ staram się przystosować

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

To co próbuję:

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

Ale wciąż te same 7 rzędów jakby nie ma odrębne w ogóle.

Dlaczego?

+1

Czy 'getDocIndex' realizacji 'IEquatable '? –

+4

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

+0

@Massimiliano Peluso Sprawdził się doskonale. Dzięki –

Odpowiedz

1

Spróbuj:

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

Nie próbowałem go, ale patrząc na twój kod sprawia, że ​​myślę, że nie usunie duplikatów, ponieważ każdy wiersz będzie oczywiście mieć Id, który pasuje do odrębnej listy Id z tego samego zestawu ..? –

+0

masz rację, zobacz teraz proszę. Miałem ten problem wcześniej i jedynym sposobem, jaki widziałem, aby go rozwiązać, była ta metoda. – lante

+0

To zadziała. Jednak wydajność jest gorsza niż wszystkie inne sugerowane odpowiedzi, ponieważ iteruje ona nad sekwencją 'docObj' * n * +1 razy, gdzie * n * jest liczbą odrębnych id: s. Tylko mówię'. Feliz Navidad, Nicolás. –

6

Jeśli chcesz Wyraźną wykonywane w sql, zadzwoń Wyraźny() przed 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

Niestety to nie rozwiązuje mojego problemu.Czy powinienem nadpisać jakąś klasę, aby to zrobić? Nadal pozostaje numerem 7 na liście –

+0

Czy wybierasz te same kolumny z instrukcji sql? – jrummell

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

Na obiekcie getDocIndex, trzeba zaimplementować interfejs IEquatable. Dzięki temu dowiesz się odrębną metodę czy twoje przedmioty są sobie równe, gdy robi porównanie. Jest to właściwy sposób na porównywanie z Distinct i jest znacznie czystszy.

public class getDocIndex: IEquatable<getDocIndex> 
{ 
    .... 
    public bool Equals(getDocIndex otherModel) 
    { 
     if (otherModel == null) 
      return false; 
     return this.idName == otherModel.idName && this.idTipo == otherModel.idTipo 
     && this.tamanho == otherModel.tamanho && this.caminho == otherModel.caminho; 
    } 
} 

Po wdrożeniu tego interfejsu można nadal wywoływać odrębne i będzie działać poprawnie.

+0

Nie wpłynie to jednak na wygenerowany kod SQL, co wydaje się być tutaj celem. – svick

+0

Po prostu odpowiedziałem na jego pytanie. "Chcę usunąć powtarzające się wiersze z LISTY używając odmiennego". "Ale wciąż mam te same 7 rzędów, jakby w ogóle nie było DISTYNKU Dlaczego?" –

0

Zawsze, gdy używasz sql, użyj .Distinct() przed .ToList(). To prawdopodobnie rozwiąże problem. Na przykład:

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

Wyraźne tylko lambda ..like tym

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

Jeśli chcemy usunąć duplikaty w kwerendy LINQ ..use grupowej

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(); 
Powiązane problemy