将查询从 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<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<System.Data.DataRow>
在select
字处引发错误。
那么,我做错了什么?我可以做些什么来避免这个转换问题?
希望有人可以帮助我,在此先感谢。
【问题讨论】:
【参考方案1】:有一种方法可以从IEnumerable<DataRow>
以外的结果创建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 复制到数据表时出错的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL Developer - 将视图从一个数据库复制到另一个数据库时出错
Pyspark - 将文件从本地(边缘节点)复制到 HDFS 位置时出错