C# 如何从dataview中选择单个分组列?
我有一个数据表C# 如何从dataview中选择单个分组列?,c#,linq,datatable,dataview,C#,Linq,Datatable,Dataview,我有一个数据表tblWorkList,有多列:RecordNr,GroupNum,部分,SubscriberID,以及其他许多列 我需要做的是创建一个dataview或第二个datatable,它相当于: SELECT SubscriberID FROM tblWorkList GROUP BY SubscriberID; 我在应用程序中这样做是因为我需要在一个dataview中结束它,然后根据多个用户输入进行过滤。我让那部分工作。我已经花了好几个小时在互联网上绞尽脑汁,试图找出如何做到这一点
tblWorkList
,有多列:RecordNr
,GroupNum
,部分
,SubscriberID
,以及其他许多列
我需要做的是创建一个dataview或第二个datatable,它相当于:
SELECT SubscriberID FROM tblWorkList GROUP BY SubscriberID;
我在应用程序中这样做是因为我需要在一个dataview中结束它,然后根据多个用户输入进行过滤。我让那部分工作。我已经花了好几个小时在互联网上绞尽脑汁,试图找出如何做到这一点,但我不断遇到解决方案中的错误,这些解决方案看起来应该有效,但最终以惊人的失败告终。尽管如此,我现在对LINQ非常缺乏经验,所以我确信我错过了一些非常简单的东西
(基本功能是这样的:该表包含要处理的记录列表。基本上,我需要让表中充满记录,将订户ID拉入dataview,允许用户通过各种方法筛选dataview(并向用户提供与所选标准匹配的SubscriberID的运行计数),完成后,将与生成的SubscriberID
集合关联的所有记录分配给要处理的特定分析员。)
我尝试用于创建SubscriberID值的列表或数据视图的所有方法都包含在以下内容中:
using (DataTable dt = dsWorkData.Tables["tblWorkData"])
表tblWorkData
包含大约23000条记录
以下是我的几次尝试
尝试1-错误为
参数不能为null。参数:源'
尝试5-与尝试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());
var result = dt.AsEnumerable().GroupBy(row => row.Field<string>("SubscriberID"));
MessageBox.Show(result.Count().ToString());
var results = dt.AsEnumerable().GroupBy(g => g["SubscriberID"])
.Select(x => x.First());
MessageBox.Show(results.Count().ToString());
所以,有人能解释一下我在这里做错了什么,或者至少能给我指出正确的方向吗?我真的不在乎使用哪种方法,只要有办法做到这一点。答案是NetMage的两条评论:
您的SQL查询实际上是使用
groupby
来执行DISTINCT
,因此只需使用LINQDISTINCT
:dt.AsEnumerable().Select(r=>r.Field(“SubscriberID”).DISTINCT()
PS您的第一个错误意味着
dt
为null
-source
是AsEnumerable
的参数名
您的SQL查询实际上是使用
groupby
来执行DISTINCT
,因此只需使用LINQDISTINCT
:dt.AsEnumerable().Select(r=>r.Field(“SubscriberID”).DISTINCT()
.PS您的第一个错误意味着dt
是null
-source
是AsEnumerable
的参数名。您可以通过在查询中添加WHERE来过滤空值。NetMage-谢谢,我明天会这样做。至于dt,我在第一次遇到错误时检查过,我正在引用的表是absolutely有记录-就在代码运行之前,表中的总记录数显示在screen.jdwent上-该字段中实际上没有空值。我检查过了,但如果NetMage的修复程序没有成功,我明天会继续使用它。谢谢!
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());
var result = dt.AsEnumerable().GroupBy(row => row.Field<string>("SubscriberID"));
MessageBox.Show(result.Count().ToString());
var results = dt.AsEnumerable().GroupBy(g => g["SubscriberID"])
.Select(x => x.First());
MessageBox.Show(results.Count().ToString());