让VS2010识别System.Data.DataSetExtensions的问题

时间:2014-02-27 20:16:04

标签: vb.net visual-studio-2010 linq

我有一个项目,我第一次开始使用LINQ,并希望使用CopyToDataTable函数。我知道要使用它我必须添加对System.Data.DataSetExtentions的引用,我已经完成了,这是语句。

Imports System.Data
Imports System.Linq
Imports System.Data.SqlClient
Imports System.Data.DataSetExtensions

最后一行收到错误:“所选的命名空间或类型不包含任何公共成员或无法找到”。

这是我正在使用的linq代码,它得到错误“'CopyToDataTable'不是'System.Collections.Generic.IEnumerable(Of Object)'的成员。”

            Dim qrySpec = _
            From tblSpecs In dtAllResults.AsEnumerable()
            Where tblSpecs.Field(Of String)("SPEC_DESC")
            Order By tblSpecs.Item("SPEC_DESC")
            Select tblSpecs.Item("SPEC_DESC") Distinct

            Dim dt As DataTable = qrySpec.CopyToDataTable()

我目前正在运行完整的.Net Framework 4.0,并已验证已添加引用,其版本为4.0。

我在研究中只能找到的东西可能是我需要恢复到.Net Framework 3.5,文件路径太长,或者SQL Server的.Net框架是3.5之前的版本。我真的需要留在4.0中,我已经尝试将dll复制到新的/更短的路径并在那里引用它。两者都没有奏效。我正在使用DBA获取SQL Server信息。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

System.Data.DataSetExtensions不是命名空间。

CopyToDataTable确实在System.Data.DataSetExtensions.dll中,但命名空间只是System.Data

编辑:

此外,CopyToDataTable定义如下:

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

您的查询中的IEnumerable必须是DataRow类型。因此,您需要以某种方式将查询结果作为DataRow返回。

当前问题是您没有选择行,而是使用Item方法选择一组对象。

<强> EDIT2

如果你所追求的只是一个不同的SPEC_DESC的DataTable,那么可能会这样:

    DataTable table2 = new DataTable();
    table2.Columns.Add("SPEC_DESC", typeof(string));

    foreach (var desc in (from row in table.AsEnumerable()
                select (string) row["SPEC_DESC"]).Distinct())
        {
                table2.Rows.Add(desc);
        }