【问题标题】:Why am I not getting .CopyToDataTable() in Linq Query()为什么我在 Linq Query() 中没有得到 .CopyToDataTable()
【发布时间】:2010-12-08 09:31:33
【问题描述】:

以下代码示例来自 MSDN here。我的代码中没有可用的 query.CopyToDataTable()。 (请参阅我以下代码中的注释行)。

public static bool SetPhysicianAsNotonServer(DataTable dt)
        {
            DataTable dtPhysicianServer = dt;
            DataTable dtPhysicianClient = GetPhysicianClient();

            var query =
                from SPhysician in dtPhysicianServer.AsEnumerable()
                join CPhysician in dtPhysicianClient.AsEnumerable()
                on SPhysician.Field<string>("PhysicianNumber") equals
                    CPhysician.Field<string>("PhysicianNumber")
                select new
                {
                    PhysicianNumber = CPhysician.Field<string>("PhysicianNumber")
                 };

            DataTable FilterDt = query; //query.CopyToDataTable();
            //YET TO DO CODE HERE
            return true;
        }

【问题讨论】:

  • 如果您尝试调用CopyToDataTable(),您会收到什么错误消息?

标签: c# asp.net linq


【解决方案1】:

对我来说这个问题是由使用 Dotnet Core 2.0 引起的,它似乎无法在转换后将 IEnumerable 转换回 DataTable

只需为遇到此问题且有相同问题的任何人添加此内容即可。

【讨论】:

    【解决方案2】:

    您的 select 语句返回的是字符串序列(IEnumerable&lt;string&gt;IQueryable&lt;string&gt;),而不是 DataRows 序列。 CopyToDataTable() 仅适用于 IEnumerable&lt;T&gt;,其中 T 是或派生自 DataRow。

    不要使用select new { ... } - 它只会为您提供该类型的新序列,请尝试:

    select CPhysician;
    

    应该返回所需的 CPhysician 行序列。

    编辑 如果您希望将非数据表派生的 T 转换为数据表,MSDN 有一个示例类,可以反映任何类型并执行转换。

    http://msdn.microsoft.com/en-us/library/bb669096.aspx

    【讨论】:

    • +1 以获得唯一完整和准确的解释(虽然可能需要引用 DataSetExtensions,但这不能解决问题)。
    • 听起来不错。但请告诉我如何解决这个问题。如果我这样做 IEnumerable query = //上面的整个代码,它不允许我在 Linq Query 中加入 Join。
    【解决方案3】:

    我认为这是因为您创建了一个匿名类型来保存 Field 对象。 试试这个:

        var query = from SPhysician in dtPhysicianServer.AsEnumerable()
                    join CPhysician in dtPhysicianClient.AsEnumerable()
                    on SPhysician.Field<string>("PhysicianNumber") equals
                        CPhysician.Field<string>("PhysicianNumber")
                    select CPhysician;
    
        DataTable FilterDt = query.CopyToDataTable();
    

    CopyToDataTable&lt;T&gt;的定义:

    public static DataTable CopyToDataTable<T>(
        this IEnumerable<T> source
    )
    where T : DataRow
    

    因此,您使用查询选择的内容必须是 IEnumerable&lt;T&gt; 类型,其中 T 扩展 DataRow

    【讨论】:

    • 您是否尝试过像其他人提到的那样引用 DataSetExtensions?
    【解决方案4】:

    它存在于特定的命名空间中你要导入它吗?

    System.Data.DataTableExtensions.CopyToDataTable() 
    

    同时确认添加此引用

    System.Data.DataSetExtensions 
    

    【讨论】:

    • DataTable.AsEnumerable 如果不包括在内也会失败。
    【解决方案5】:

    进一步浏览 MSDN 在线将我带到此页面:http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

    它在 System.Data 命名空间中说明(使用 System.Data),您需要引用 System.Data.DataSetExtensions.dll。

    【讨论】:

    • 如果这是问题所在,那么对 AsEnumerable 的调用就会失败,不是吗?
    • 我猜你是对的。我只做了一点点研究,没有 VS 进行测试......而且我看到@Rex M 可能对这个问题有正确的答案:-)
    【解决方案6】:

    您是否引用了 System.Data.DataSetExtensions 程序集?此处定义了此扩展方法。

    【讨论】:

      【解决方案7】:

      您需要引用System.Data.DataSetExtensions 程序集并使用System.Data 命名空间。

      【讨论】:

      • 这不是参考问题。 DataSetExtensions 程序集已经存在。
      猜你喜欢
      • 2022-01-22
      • 2020-11-19
      • 2013-07-15
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2020-04-09
      • 2015-11-26
      • 2023-03-06
      相关资源
      最近更新 更多