2012-04-03 115 views
7

我有一個查詢LINQ不同,並選擇新的查詢

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

結果是:

  • 1諾夫伊萬
  • 1諾夫伊萬
  • 2 Petrov的彼得
  • 3西多羅夫伊凡
  • 3 Sidorov Ivan

,我需要的結果是:

  • 1伊萬諾夫伊萬
  • 2彼得羅夫切赫
  • 3西多羅夫伊萬
+0

你有沒有試過對你的數據源應用'Distinct',比如'from QProductAllInfo.Distinct()'中的? – madd0 2012-04-03 11:22:36

+0

是的。 Dosn't工作 – alexandrovdi 2012-04-03 12:35:40

回答

6

假設不同的ID總是被認爲是不同的,你可以試試這個。

我可能會寫在兩個查詢。這樣就很容易調試並且更易讀。您可以使用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); 

您還可以使用

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

它是幫助,但我不能做這樣的代碼datagridview.datasource = result; – alexandrovdi 2012-04-03 13:27:23

+1

您無法將Ienumerable分配給數據源。請谷歌如何將Ienumerable分配給數據源。我不擅長ASP.net – Sandeep 2012-04-03 13:30:47

+0

謝謝你DistinctBy工作! – alexandrovdi 2012-04-03 14:08:26

0

您可以實現的是的IEqualityComparer使用.Distinct,以確定是否項目已經存在於列表中。它可以比較屬性而不是對同一對象的引用。

但我不知道它是否適用於匿名類型。

2

如果您在QProductAllInfo有重複,由此免去您的代碼應該解決您的問題。

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

如果這不起作用,你可以使用元組,而不是匿名類型是這樣的:

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

應用匿名類型DISTINCT運算符是無用的,因爲匿名類型總是引用donc類型實現IEquatable接口。

+0

在實際中,我需要選擇多於8項。最後我需要做下一步:datagridview.datasource = QP; – alexandrovdi 2012-04-03 13:38:08