我需要在一个DataTable对象的linq中执行此查询
Select * from mydatatable m where m.id==myid group by myField
如果我尝试使用此代码,我在CopyToDataTable()
上会出错int _idOrg=10;
DataTable dtAbb = (DataTable)ViewState["dtAbb "];
var var_sez = from myRow in dtAbb .AsEnumerable()
group myRow by myRow.Field<string>("ID_IST") into newRow
where newRow.First().Field<int>("ID_ORG") == _idOrg
select newRow;
DataTable dtSez = null;
if (var_sez.Count() > 0)
dtSezione = var_sez.AsEnumerable().CopyToDataTable();
答案 0 :(得分:1)
您不能在CopyToDataTable
的一组DataRows
上使用IEnumerable<DataRow>
,而只能在var var_sez = from myRow in dtAbb.AsEnumerable()
where myRow.Field<int>("ID_ORG") == _idOrg
group myRow by myRow.Field<string>("ID_IST") into grp
select grp.First();
上使用Where
。因此,您必须从每个组中获取所有行(但为什么要对所有行进行分组)或使用每个组的特定行。在这里我简单介绍第一个:
GroupBy
请注意,我还在{{1}}之前移动了{{1}}。您只选择第一行ID与给定ID匹配的组。我假设你只有这个ID的行。 因此,这种方法“更具核心”,更有效率。
答案 1 :(得分:0)
如果要在查询结果中使用ToDataTable
,则必须稍微扩展LINQ。
&#34; LINQ in Action&#34; book有一个很好的代码伴侣here。下载它,找到ObjectShreder.cs
并DataSetLinqOperators.cs
将它们包含到您的项目中,这些方法可用于IEnumerable<DataRow>
以外的其他类型
参考:http://codecorner.galanter.net/2009/12/17/grouping-ado-net-datatable-using-linq/