2012-04-03 30 views
7

Tôi có một truy vấnLINQ biệt và chọn mới truy vấn

var QP = (from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}).Distinct(); 

Kết quả là:

  • 1 Ivanov Ivan
  • 1 Ivanov Ivan
  • 2 Petrov Petr
  • 3 Sidorov Ivan
  • 3 Sidorov Ivan

và tôi cần kết quả:

  • 1 Ivanov Ivan
  • 2 Petrov Petr
  • 3 Sidorov Ivan
+0

Bạn đã thử áp dụng 'Distinct' cho nguồn dữ liệu của mình, như' from a QProductAllInfo.Distinct() '? – madd0

+0

có. Không nên làm việc – alexandrovdi

Trả lời

6

Giả sử rằng các Id khác nhau luôn được coi là khác biệt, bạn có thể thử điều này.

Tôi có thể viết nó trong hai truy vấn. Bằng cách đó nó rất dễ dàng để gỡ lỗi và dễ đọc hơn. Bạn có thể sử dụng MoreLinq.

DistinctBy

Download

var temp = from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}.ToList(); 

var result = temp.DistinctBy(i => i.Id); 

Bạn cũng có thể sử dụng

Var result = temp.GroupBy(x => x.Id).Select(y => y.First()); 
+0

nó được giúp nhưng tôi không thể làm mã như thế này datagridview.datasource = kết quả; – alexandrovdi

+1

Bạn không thể gán Ienumerable cho Datasource. Vui lòng google về cách gán Ienumerable cho Datasource. Tôi không giỏi tại ASP.net – Sandeep

+0

Cảm ơn bạn về DistinctBy Work !!! – alexandrovdi

0

Bạn có thể thực hiện một IEqualityComparer rằng việc sử dụng .Distinct để xác định xem mục đã tồn tại trong danh sách. Nó có thể so sánh trên các thuộc tính thay vì trên tham chiếu đến cùng một đối tượng.

Nhưng tôi không biết nếu nó hoạt động trên các loại ẩn danh.

2

Nếu bạn có bản sao ở QProductAllInfo, thay thế mã của bạn bằng cách này nên khắc phục vấn đề của bạn.

var QP = from a in QProductAllInfo.Distinct() 
     select new { a.Id, a.Title, a.FullTitle }; 

nếu điều này không làm việc, bạn có thể sử dụng các bộ thay vì các loại vô danh như thế này:

var QP = from a in QProductAllInfo 
     select Tuple.Create(a.Id, a.Title, a.FullTitle); 

Áp dụng các nhà điều hành riêng biệt trên các loại vô danh là vô ích vì các loại vô danh luôn tham khảo loại mà donc triển khai giao diện IEquatable.

+0

trong thực tế tôi cần chọn thêm 8 mục. và cuối cùng tôi cần làm tiếp theo: datagridview.datasource = QP; – alexandrovdi