linq distinct并选择新查询

时间:2012-04-03 11:14:08

标签: c# windows winforms linq linq-to-sql

我有一个查询

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

结果是:

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

我需要结果:

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

3 个答案:

答案 0 :(得分:7)

假设不同的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());

答案 1 :(得分: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运算符是没用的,因为匿名类型始终是不实现IEquatable接口的引用类型。

答案 2 :(得分:0)

您可以实现一个IEqualitycomparer,.Distinct用它来确定该项目是否已存在于列表中。它可以在属性上进行比较,而不是在对同一对象的引用上进行比较。

但我不知道它是否适用于匿名类型。