2

基于这个问题:

[如何使用 LINQ 执行 SELECT UNIQUE?

我编写了以下表达式来从包含多列的数据表中选择具有唯一OrganizationID列的行。dt

var distinctRows = (from DataRow dRow in dt.Rows
                    select new { col1 = dRow["OrganizationID_int"] }).Distinct();

但是当我distinctRows在执行表达式后检查时,它只有 1 列 ( col1) 的记录,而不是保存整个列。我担心添加诸如col2=...等之类的表达式可能会被解释为我想在所有这些列上选择不同的。

那么,如何在仅对 1 列而不是整列应用唯一过滤器时获取整行?

4

5 回答 5

5

我想要满足所有列的独特条件的整行。我想在下一步中迭代。

因此,您不想按该字段分组并返回多行之一。您只需要唯一的行。

一种方法是使用Enumerable.GroupBy并计算每组中的行数:

var uniqueRows = dt.AsEnumerable()
                   .GroupBy(r => r.Field<int>("OrganizationID_int"))
                   .Where(g => g.Count() == 1)
                   .Select(g => g.First());
于 2012-11-27T13:52:47.430 回答
1

Distinct异常方法有两个版本,其中一个采用IEqualityComparar可以确定您将如何区分不同的元素。

这里是如何使用此方法的完整示例:

class Item
{
    public int Id {get; set;}
    public string Name {get;set;}
}

class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item x)
    {
        return x.Id;
    }
}

void Main()
{
  var sequence = new List<Item>() 
  {
      new Item {Id = 1, Name = "1"}, 
      new Item {Id = 1, Name = "2"}
  };

  // Using overloaded version of Distinct method!
  var distinctSequence = sequence.Distinct(new ItemComparer());

  // distinctSequence contains inly one Item with Id = 1
  distinctSequence.Dump();
}
于 2012-11-27T13:21:50.830 回答
1

您正在寻找的是GroupBy,然后是一个聚合函数,如Min,Sum等,为每列选择一个行值。

var distinctRows = 
    (from DataRow dRow in dt.Rows
    group dRow by dRow["OrganizationID_int"] into g
    select new { OrgId = g.Key; Col2 = g.First().Col2, Col3 = g.First().Col3 })
于 2012-11-27T13:22:59.550 回答
1

使用 Linq to DataSet 分组:

var distinctRows = from row in dt.AsEnumerable()
                   group row by new { 
                      col1 = row.Field<int>("OrganizationID_int")
                      // other columns here 
                   } into g
                   select g.First();
于 2012-11-27T13:25:16.580 回答
1

看看MoreLinqDistinctBy方法,你可以用它来表达你的查询,如下所示:

dt.Rows.DistinctBy(dRow => dRow["OrganizationID_int"])
于 2012-11-27T13:25:38.453 回答