1

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

我的第一个代码如下:

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

因此,由于我需要将查询的内容复制到 aDatatable我尝试了这个

 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一言以蔽之。

那么,我做错了什么?我该怎么做才能避免这种转换问题?

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

4

3 回答 3

4

有一种方法可以DataTable从 以外的结果创建IEnumerable<DataRow>,但它相当复杂。实现通用类型 T 不是 DataRow 的 CopyToDataTable

不过,对于您的情况,我建议您按照以下方式进行操作。回到原来的查询:

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"
    }
);

最后,查看查询结果并手动DataRowsDataTable.

foreach (var element in query)
{
    var row = myDataTable.NewRow();
    row["Name"] = element.Name;
    myDataTable.Rows.Add(row);
}
于 2012-09-05T23:40:13.863 回答
3

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

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

于 2012-09-05T20:58:21.150 回答
1

我猜这会做

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()
于 2012-09-05T20:57:00.487 回答