【问题标题】:Error when Copying Query from linq to Datatable将查询从 linq 复制到数据表时出错
【发布时间】: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 字处引发错误。

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

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

【问题讨论】:

    标签: c# linq ienumerable


    【解决方案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
        • 糟糕,我错过了,我将添加它
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多