如何从DataView中选择多个字段并使用LINQ应用.Distinct()

时间:2015-02-24 10:14:39

标签: c# linq linq-to-sql

我想从DataView中选择一些字段,然后在选择这些字段后,在这些字段集上应用.Distinct()。

现在,我使用了这段代码:

DataView dvGroups = new DataView();
dvGroups = GetDataFromDatabase(); //-- Fill Dataview
var groups = dvGroups.Table.AsEnumerable()
                           .Where(x => x.Field<int>("GroupId") != 0)
                           .Select(p => p.Field<int>("GroupId"))
                           .Distinct()
                           .ToArray();

它只选择一个字段(即"GroupId")。但是,现在我想选择多个字段(如"GroupId", "GroupName"),然后获取不同的值。

我怎样才能完成这项任务?

2 个答案:

答案 0 :(得分:1)

您可以创建匿名对象:

.Select(p => new {
    GroupId = p.Field<int>("GroupId"),
    Something = p.Field<string>("Something"),
})
.Distinct().ToArray();
例如,因为匿名类型是&#34;兼容&#34;使用Distinct()(请参阅LINQ Select Distinct with Anonymous Types),因为编译器会生成Equals / GetHashCode方法。

或者您可以使用Tuple

.Select(p => Tuple.Create(p.Field<int>("GroupId"), p.Field<string>("Something")))

但他们通常不太清楚。

更复杂的是创建您的课程并实施EqualsGetHashCode

答案 1 :(得分:1)

您可以使用匿名类型:

var groups = dvGroups.Table
          .AsEnumerable()
          .Where(x => x.Field<int>("GroupId") != 0)
           .Select(p => new 
                        { 
                            id = p.Field<int> ("GroupId"),
                            name = p.Field<string> ("Name"))
                        }).Distinct().ToArray();