如何从数据视图中选择单个分组列?

Posted

技术标签:

【中文标题】如何从数据视图中选择单个分组列?【英文标题】:How do I select a single grouped column from a dataview? 【发布时间】:2020-12-20 23:52:27 【问题描述】:

我有一个数据表tblWorkList,其中包含多个列:RecordNrGroupNumSectionSubscriberID 以及其他一些列。

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

SELECT SubscriberID FROM tblWorkList GROUP BY SubscriberID;

我在应用程序中执行此操作,因为我需要将其置于数据视图中,然后根据多个用户输入进行过滤。我有那部分工作。我现在已经花了几个小时在互联网上试图弄清楚如何做到这一点,但是我一直遇到解决方案中的错误,这些错误看起来应该可以工作,但最终却失败了。虽然,也就是说,我现在对 LINQ 非常缺乏经验,所以我确信我错过了一些非常简单的东西。

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

我尝试用来创建订阅者ID 值的列表或数据视图的所有方法都包含在以下内容中:

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

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

这是我的一些尝试。

尝试 1 - 错误是

参数不能为空。参数:来源'

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 - 错误是

'不能隐式转换匿名类型: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 - 错误是

'当前上下文中不存在[第三个]名称'row'。'

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());

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

【问题讨论】:

你的SQL查询确实是用GROUP BYDISTINCT,所以只用LINQDistinct:dt.AsEnumerable().Select(r =&gt; r.Field&lt;string&gt;("SubscriberID") ).Distinct() PS 您的第一个错误意味着dtnull - sourceAsEnumerable 的参数名称。 您可以通过在查询中添加 WHERE 来过滤空值。 NetMage - 谢谢,我明天再做。至于 dt,我在第一次遇到错误时进行了检查,并且我引用的表绝对有记录 - 就在该代码运行之前,表中的总记录数显示在屏幕上。 jdwent - 该字段中实际上没有空值。我检查过,但如果 NetMage 的修复没有成功,我明天会更多地使用它。谢谢! 【参考方案1】:

答案是一对来自 NetMage 的 cmets:

您的 SQL 查询实际上是使用 GROUP BY 来执行 DISTINCT,所以只需使用 LINQ Distinct:dt.AsEnumerable().Select(r =&gt; r.Field&lt;string&gt;("SubscriberID") ).Distinct()

PS 您的第一个错误意味着dtnull - sourceAsEnumerable 的参数名称。

【讨论】:

以上是关于如何从数据视图中选择单个分组列?的主要内容,如果未能解决你的问题,请参考以下文章

从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]

如何在 ASP.NET MVC 视图中对数据进行分组?

如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?

excel如何不重复分组

Laravel 选择列,然后按日期对列值进行分组

Linq to sql,聚合列,按日期分组到列表视图