如何 select 来自数据视图的单个分组列?
How do I select a single grouped column from a dataview?
我有一个包含多列的数据 table tblWorkList
:RecordNr
、GroupNum
、Section
、SubscriberID
,相当多其他几个。
我需要做的是创建一个数据视图或第二个数据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
.
我有一个包含多列的数据 table tblWorkList
:RecordNr
、GroupNum
、Section
、SubscriberID
,相当多其他几个。
我需要做的是创建一个数据视图或第二个数据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 doDISTINCT
, so just use the LINQDistinct
:dt.AsEnumerable().Select(r => r.Field<string>("SubscriberID") ).Distinct()
.PS Your first error implies that
dt
isnull
-source
is the parameter name toAsEnumerable
.