如何将LINQ查询结果存入自定义MyDataTable类?
解决LINQ查询结果存入自定义DataTable的问题
咱们一步步拆解你遇到的两个问题,再给出可行的解决方案:
第一个问题:无法将EnumerableRowCollection转换为MyDataTable
直接把LINQ查询结果赋值给MyDataTable变量肯定行不通,核心原因是类型不匹配:
- LINQ的
Where+Select操作返回的是EnumerableRowCollection<DataRow>,本质是一个DataRow的集合,而不是DataTable(或它的子类MyDataTable)对象。 - 编译器不允许把集合类型直接转换成DataTable类型,所以会抛出类型转换错误。
第二个问题:“嵌入语句不能是声明或标记语句”错误
这个错误和LINQ本身无关,是C#的语法规则限制:你应该是把EnumerableRowCollection<DataRow>的声明直接放在了嵌入语句里(比如if、for的单行语句块中)。举个错误示例:
if(someCondition) EnumerableRowCollection<DataRow> selection = ...; // 这里会触发报错
C#不允许在无大括号包裹的嵌入语句里直接声明变量,解决方法很简单——给嵌入语句加上大括号:
if(someCondition) { EnumerableRowCollection<DataRow> selection = ...; // 这样就正常了 }
正确方案:将LINQ结果导入MyDataTable
你的MyDataTable已经预定义了列结构,只需要把LINQ查询到的DataRow导入进去即可,这里提供两种实用方案:
方案1:循环添加DataRow(直观易懂)
// 1. 实例化自定义DataTable MyDataTable myDt = new MyDataTable(); // 2. 执行LINQ筛选 var filteredRows = MasterDataTable .AsEnumerable() .Where(rr => rr.Field<string>("ColumnName1") == SelectedValue1 && rr.Field<string>("ColumnName2") == SelectedValue2 && rr.Field<string>("ColumnName3") == SelectedValue3 && rr.Field<string>("ColumnName4") == SelectedValue4); // 3. 将筛选后的行导入自定义表 foreach (var row in filteredRows) { // ImportRow会完整复制行数据到新表 myDt.ImportRow(row); }
方案2:利用CopyToDataTable简化操作
如果觉得循环麻烦,可以先用CopyToDataTable()把LINQ结果转成普通DataTable,再导入到自定义表中:
MyDataTable myDt = new MyDataTable(); // 先转成普通DataTable DataTable tempDt = MasterDataTable .AsEnumerable() .Where(rr => rr.Field<string>("ColumnName1") == SelectedValue1 && rr.Field<string>("ColumnName2") == SelectedValue2 && rr.Field<string>("ColumnName3") == SelectedValue3 && rr.Field<string>("ColumnName4") == SelectedValue4) .CopyToDataTable(); // 导入自定义表 foreach (DataRow row in tempDt.Rows) { myDt.ImportRow(row); }
注意:
CopyToDataTable()要求查询结果不能为空,如果存在返回空的场景,建议先通过filteredRows.Any()判断,避免抛出异常。
额外优化:给自定义表添加导入方法
你可以给MyDataTable新增一个静态方法,专门处理从DataRow集合导入数据的逻辑,后续使用会更便捷:
public class MyDataTable : DataTable { public MyDataTable() { this.Columns.Add("ColumnName1"); this.Columns.Add("ColumnName2"); this.Columns.Add("ColumnName3"); this.Columns.Add("ColumnName4"); } // 新增静态方法:快速从DataRow集合创建MyDataTable public static MyDataTable FromRows(IEnumerable<DataRow> rows) { MyDataTable table = new MyDataTable(); foreach(var row in rows) { table.ImportRow(row); } return table; } }
之后使用时一行代码就能搞定:
MyDataTable myDt = MyDataTable.FromRows( MasterDataTable.AsEnumerable() .Where(rr => rr.Field<string>("ColumnName1") == SelectedValue1 && rr.Field<string>("ColumnName2") == SelectedValue2 && rr.Field<string>("ColumnName3") == SelectedValue3 && rr.Field<string>("ColumnName4") == SelectedValue4) );
内容的提问来源于stack exchange,提问作者Rico Strydom
相关产品推荐
相关产品推荐

