问题描述
我有一个数据表tblWorkList
,其中包含多列:RecordNr
,GroupNum
,Section
,SubscriberID
,还有很多其他列。
SELECT SubscriberID FROM tblWorkList GROUP BY SubscriberID;
我正在应用程序中执行此操作,因为我需要此操作结束于一个数据视图中,然后该数据视图将根据多个用户输入进行过滤。我有那部分工作。我已经花了几个小时在互联网上狂奔,试图弄清楚如何做到这一点,但是我一直在寻找解决方案中的错误,这些错误看起来像它们应该起作用,但最终会失败。虽然,也就是说,我现在对LINQ完全没有经验,所以我确定我缺少一些非常简单的东西。
(基本功能是:该表包含要处理的记录的列表。基本上,我需要将该表充满记录,将订户ID放入数据视图中,允许用户通过以下方式过滤该数据视图多种方法(并向用户提供与所选条件匹配的SubscriberID的数量的连续计数),完成后,将与结果SubscriberID
集合关联的所有记录分配给特定分析师,以进行处理。)
我试图用来创建SubscriberID值的列表或数据视图的所有方法都包含在其中:
using (DataTable dt = dsWorkData.Tables["tblWorkData"])
表tblWorkData
包含大约23,000条记录。
这是我的几次尝试。
尝试1-错误
参数不能为空。参数: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-错误
“无法隐式转换匿名类型:将字符串SubscriberID转换为DaTarow”
EnumerableRowCollection<DaTarow> query =
from row in dt.AsEnumerable()
group row by row.Field<string>("SubscriberID") into grp
select new { SubscriberID = grp.Key };
尝试3-错误
“ [第三个]名称“行”在当前上下文中不存在。”
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的一对评论:
您的SQL查询实际上是在使用
GROUP BY
来执行DISTINCT
,因此只需使用LINQDistinct
:dt.AsEnumerable().Select(r => r.Field<string>("SubscriberID") ).Distinct()
。PS您的第一个错误意味着
dt
是null
-source
是AsEnumerable
的参数名称。