使用linq的Asp.NET DataTable查询

时间:2013-09-27 15:22:22

标签: asp.net linq datatable group-by

我需要在一个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();

2 个答案:

答案 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.csDataSetLinqOperators.cs将它们包含到您的项目中,这些方法可用于IEnumerable<DataRow>以外的其他类型

参考:http://codecorner.galanter.net/2009/12/17/grouping-ado-net-datatable-using-linq/