如何从数据视图中选择单个分组列?
Posted
技术标签:
【中文标题】如何从数据视图中选择单个分组列?【英文标题】:How do I select a single grouped column from a dataview? 【发布时间】:2020-12-20 23:52:27 【问题描述】:我有一个数据表tblWorkList
,其中包含多个列:RecordNr
、GroupNum
、Section
、SubscriberID
以及其他一些列。
我需要做的是创建一个数据视图或第二个数据表,相当于:
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 BY
做DISTINCT
,所以只用LINQDistinct
:dt.AsEnumerable().Select(r => r.Field<string>("SubscriberID") ).Distinct()
。
PS 您的第一个错误意味着dt
是null
- source
是AsEnumerable
的参数名称。
您可以通过在查询中添加 WHERE 来过滤空值。
NetMage - 谢谢,我明天再做。至于 dt,我在第一次遇到错误时进行了检查,并且我引用的表绝对有记录 - 就在该代码运行之前,表中的总记录数显示在屏幕上。
jdwent - 该字段中实际上没有空值。我检查过,但如果 NetMage 的修复没有成功,我明天会更多地使用它。谢谢!
【参考方案1】:
答案是一对来自 NetMage 的 cmets:
您的 SQL 查询实际上是使用
GROUP BY
来执行DISTINCT
,所以只需使用 LINQDistinct
:dt.AsEnumerable().Select(r => r.Field<string>("SubscriberID") ).Distinct()
。PS 您的第一个错误意味着
dt
是null
-source
是AsEnumerable
的参数名称。
【讨论】:
以上是关于如何从数据视图中选择单个分组列?的主要内容,如果未能解决你的问题,请参考以下文章
从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]