You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:38:07