如何 select 来自数据视图的单个分组列?

How do I select a single grouped column from a dataview?

我有一个包含多列的数据 table tblWorkListRecordNrGroupNumSectionSubscriberID,相当多其他几个。

我需要做的是创建一个数据视图或第二个数据table,相当于:

SELECT SubscriberID FROM tblWorkList GROUP BY SubscriberID;

我在应用程序中执行此操作,因为我需要它最终出现在数据视图中,然后该数据视图将根据多个用户输入进行过滤。我有那部分工作。我现在已经花了几个小时在互联网上苦思冥想,试图弄清楚如何做到这一点,但我一直 运行 反对解决方案中的错误,这些错误看起来应该有效,但最终却以惊人的失败告终。尽管如此,我现在对 LINQ 非常缺乏经验,所以我确信我遗漏了一些非常简单的东西。

(基本功能是这样的:table 包含要处理的记录列表。基本上,我需要获取 table 完整的记录,将订阅者 ID 拉入数据视图, 允许用户通过多种方法过滤该数据视图(并为用户提供 运行 与所选条件匹配的 SubscriberID 的计数),完成后,分配所有关联的记录将生成的 SubscriberID 集合交给特定的分析师进行处理。)

我试图用来创建 SubscriberID 值的列表或数据视图的所有方法都包含在其中:

using (DataTable dt = dsWorkData.Tables["tblWorkData"])

table tblWorkData 包含大约 23,000 条记录。

以下是我的一些尝试。

尝试 1 - 错误是

Parameter may not be null. Parameter: source'

var result1 = from row in dt.AsEnumerable()
              group row by row.Field<string>("SubscriberID") into grp
              select new { SubscriberID = grp.Key };

ShowMessage(result1.Count().ToString());

尝试 2 - 错误是

'Cannot implicitly convert anonymous type: string SubscriberID to DataRow'

EnumerableRowCollection<DataRow> query =
    from row in dt.AsEnumerable()
    group row by row.Field<string>("SubscriberID") into grp
    select new { SubscriberID = grp.Key };

尝试 3 - 错误是

'The [third] name 'row' does not exist in the current context.'

EnumerableRowCollection<DataRow> query2 =
    from row in dt.AsEnumerable()
    group row by row.Field<string>("SubscriberID") into grp
    select row;

尝试 4 - 与尝试 1 相同的错误:

DataTable newDt = dt.AsEnumerable()
    .GroupBy(r => new { SubscriberID = r["SubscriberID"] })
    .Select(g => g.OrderBy(r => r["SubscriberID"]).First())
    .CopyToDataTable();

MessageBox.Show(newDt.Rows.Count.ToString());

尝试 5 - 与尝试 1 相同的错误:

var result = dt.AsEnumerable().GroupBy(row => row.Field<string>("SubscriberID"));

MessageBox.Show(result.Count().ToString());

尝试 6 - 与尝试 1 相同的错误:

var results = dt.AsEnumerable().GroupBy(g => g["SubscriberID"])
                                          .Select(x => x.First());
MessageBox.Show(results.Count().ToString());

所以有人可以解释我在这里做错了什么,或者至少给我指出正确的方向吗?我真的不在乎使用哪种方法,为了记录,只要有办法做到这一点。

答案是NetMage的一对评论:

Your SQL query is really using GROUP BY to do DISTINCT, so just use the LINQ Distinct: dt.AsEnumerable().Select(r => r.Field<string>("SubscriberID") ).Distinct().

PS Your first error implies that dt is null - source is the parameter name to AsEnumerable.