2012-12-19 38 views
12

Tôi muốn xóa các hàng lặp lại khỏi một danh sách bằng cách sử dụng riêng biệt.Đặc biệt không hoạt động với LINQ

Đây là resultset (Như bạn có thể thấy, chỉ số 12 và 14 được lặp lại)

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 

Đây là sql Tôi muốn archieve (điều này không được công việc)

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 

Đây là LINQ Tôi đang cố gắng điều chỉnh

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

Đây là những gì tôi đang cố gắng:

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

Nhưng tôi vẫn nhận được cùng 7 hàng như nếu không có DISTINCT ở tất cả.

Tại sao?

+1

Liệu 'getDocIndex' thực hiện 'IEquatable '? –

+4

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

+0

@Massimiliano Peluso Làm việc hoàn hảo. Cảm ơn –

Trả lời

1

Hãy thử:

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

Tôi chưa thử, nhưng nhìn vào mã của bạn khiến tôi nghĩ rằng nó sẽ không xóa các bản trùng lặp vì mọi hàng sẽ có một Id khớp với danh sách Id riêng biệt từ cùng một tập hợp ..? –

+0

bạn nói đúng, hãy xem ngay bây giờ. tôi đã có vấn đề này trước và cách duy nhất tôi thấy để giải quyết nó là phương pháp này – lante

+0

Điều đó sẽ làm việc. Tuy nhiên, hiệu suất kém hơn tất cả các câu trả lời được đề xuất khác, vì nó lặp lại trong chuỗi 'docObj' * n * +1 lần, trong đó * n * là số id riêng biệt: s. Chỉ cần nói. Feliz Navidad, Nicolás. –

6

Nếu bạn muốn các biệt thực hiện trong sql, gọi riêng biệt() trước khi 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

Thật không may điều này không giải quyết được vấn đề của tôi.Tôi có nên ghi đè lên một số lớp để hoàn thành nó không? Vẫn còn 7 itens trong Danh sách –

+0

Bạn có chọn các cột giống nhau từ câu lệnh sql của mình không? – jrummell

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

Mở đối tượng getDocIndex của bạn, bạn cần phải thực hiện các giao diện IEquatable. này sẽ cho các phương pháp riêng biệt hay không đối tượng của bạn đều bình đẳng với nhau khi nó hoạt động so sánh. Đây là cách thích hợp để so sánh với Distinct và nó sạch hơn nhiều.

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

Sau khi triển khai giao diện này, bạn có thể tiếp tục gọi riêng và nó sẽ hoạt động chính xác.

+0

Nhưng điều này sẽ không ảnh hưởng đến SQL được tạo, mà dường như là ý định ở đây. – svick

+0

Tôi đơn giản trả lời câu hỏi của anh ấy. "Tôi muốn xóa các hàng lặp lại khỏi một DANH SÁCH bằng cách sử dụng riêng biệt". "Nhưng tôi vẫn nhận được cùng 7 hàng như thể không có DISTINCT nào cả. Tại sao?" –

0

Bất cứ khi nào sử dụng sql, hãy sử dụng .Distinct() trước .ToList(). Điều này có thể sẽ giải quyết được vấn đề. Ví dụ:

công trình
var ans = (from x in xyx 
      where ... 
      select new ... 
      { 
       a = ..., 
       b = ... 
      }).Distinct().ToList(); 
0

biệt chỉ Lambda ..like này

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

nếu chúng ta muốn loại bỏ bản sao trong truy vấn LINQ ..use nhóm

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(); 
Các vấn đề liên quan