将查询从 linq 复制到数据表时出错

Posted

技术标签:

【中文标题】将查询从 linq 复制到数据表时出错【英文标题】:Error when Copying Query from linq to Datatable 【发布时间】:2012-08-30 15:45:00 【问题描述】:

我刚开始从事一个需要Linq to Sql 的项目,并且已经能够进行查询和检索数据。但现在我需要用我正在检索的数据填写DataTable

我的第一个代码如下:

MyDatabase db = new MyDatabase();
var query = from cust in db.Customers
            where cust.CustomerName != "Dante"
            orderby cust.CustomerName
            select new  Name = cust.CustomerName ; 

所以,由于我需要将查询内容复制到 Datatable,我尝试了 this:

 IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

然后,我的代码如下所示:

IEnumerable<DataRow> myQuery = from cust in db.Customers.AsEnumerable()
                    where cust.Name != "Dante"
                    orderby cust.Name
                    select new  Name = cust.Name ;

DataTable myDataTable = myQuery.CopyToDataTable<DataRow>();

但是使用此代码编译器会引发错误:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;AnonymousType#1&gt;' to 'System.Collections.Generic.IEnumerable&lt;System.Data.DataRow&gt;

select 字处引发错误。

那么,我做错了什么?我可以做些什么来避免这个转换问题?

希望有人可以帮助我,在此先感谢。

【问题讨论】:

【参考方案1】:

有一种方法可以从IEnumerable&lt;DataRow&gt; 以外的结果创建DataTable,但它相当复杂。 Implement CopyToDataTable Where the Generic Type T Is Not a DataRow.

不过,对于您的情况,我建议您采用以下方式。返回原始查询:

MyDatabase db = new MyDatabase();
var query = from cust in db.Customers
            where cust.CustomerName != "Dante"
            orderby cust.CustomerName
            select new  Name = cust.CustomerName ;

然后定义您的单个字段 DataTable,因为当您最终创建一个 DataRow 时,它需要一个架构来工作:

DataTable myDataTable = new DataTable();
myDataTable.Columns.Add(
    new DataColumn()
    
        DataType = System.Type.GetType("System.String"),
        ColumnName = "Name"
    
);

最后,检查您的查询结果并手动将DataRows 添加到您的DataTable

foreach (var element in query)

    var row = myDataTable.NewRow();
    row["Name"] = element.Name;
    myDataTable.Rows.Add(row);

【讨论】:

【参考方案2】:

问题与错误状态完全相同;您的“选择”子句正在创建具有一个成员“名称”的匿名类型的实例。此匿名类型不是也不能是 DataRow,因此查询生成的内容与您要设置的变量之间的隐式转换失败。

相反,您应该使用此查询,并为它返回的每个匿名类型元素添加值作为 DataTable 的新 DataRow。您不能只是从头开始创建一个新的 DataRow; DataRow 类需要一个上下文,即父 DataTable,来定义 DataRow 应具有的列。

【讨论】:

【参考方案3】:

我猜会这样

var myQuery = from cust in db.Customers.AsEnumerable()
                    where cust.Name != "Dante"
                    orderby cust.Name
                    select new  Name = cust.Name ;

或者试试这个

 string[] myQuery = db.Customers.Rows
                       .Cast<DataRow>()
                       .Where(r=>r.Name!="Dante")
                       .Orderby(r=>r.Name)
                       .Select(r=>r.Field<string>("Name"))
                       .ToArray()

【讨论】:

这对我没用,如果我使用var 那么myQuery 对象不会显示方法CopyToDataTable 的定义 您可以将该 myquery 转换为 DataRow 数组。 感谢您为回答所做的努力,我的问题是,我只需要选择整行的一列,因此,您编辑的答案对我不起作用,因为它返回一个数组包含 Customer 表的所有列的 DataRows 糟糕,我错过了,我将添加它

以上是关于将查询从 linq 复制到数据表时出错的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 HDFS 复制到 Hive 中的外部表时出错

Oracle SQL Developer - 将视图从一个数据库复制到另一个数据库时出错

Hive - 将数据复制到表中时出错

Pyspark - 将文件从本地(边缘节点)复制到 HDFS 位置时出错

将数据从 ADLS Gen2 加载到 Azure Synapse 时出错

将数据框复制到 Impala 数据库时出错