LINQ to DataTable简单快捷

时间:2012-07-15 11:45:06

标签: asp.net linq datatable

我是LINQ的新手,我想将LINQ查询转换为DataTable

    DataClassesDataContext db = new DataClassesDataContext(MyConncectionString);
    IEnumerable<DataRow> qry = (IEnumerable<DataRow>)(from tbl in db.Table1.AsEnumerable()
                                                     select tbl);
    DataTable dt=new DataTable();
    qry.CopyToDataTable(dt, LoadOption.OverwriteChanges);
    GridView1.DataSource = dt;

但我收到了错误

无法将类型为'WhereSelectEnumerableIterator的对象强制转换为'System.Collections.Generic.IEnumerable`1 [System.Data.DataRow]'。

任何人都可以帮助我吗

2 个答案:

答案 0 :(得分:1)

我认为这里转换成linq是不必要的?因为你已经获得了数据表并且你正在使用它并再次将它转换回linq。所以除非你有充分的理由在这里使用linq,否则你应该坚持使用数据表。

     DataClassesDataContext db = new DataClassesDataContext(MyConncectionString);
     IEnumerable<DataRow> qry = (IEnumerable<DataRow>)(from tbl in db.Table1.AsEnumerable()
                                                 select tbl);
    DataTable dt=new DataTable();
    qry.CopyToDataTable(dt, LoadOption.OverwriteChanges);
    GridView1.DataSource = dt;

应该是,

    GridView1.DataSource = db.Table1

答案 1 :(得分:1)

这些是基本概念:

.Net框架附带了几个LINQ提供程序

  • LINQ to Objects。 System.Linq的。它是LINQ核心,旨在与内存中的集合一起使用

  • LINQ to XML。 System.Xml.Linq使用XML文档

  • LINQ to DataSet。使用DataTable和DataSet对象

  • LINQ to SQL。 System.Data.Linq它用于处理SQL Server数据库

  • LINQ to Entities。 (实体框架)用于处理多个数据库。它提供了更丰富的API

我认为你要做的是:

从LINQ to SQL上下文返回的查询中,您希望返回DataRow个对象的集合。

LINQ to SQL对象和DataRow之间没有简单的转换,所以如果你坚持要求使用反射来获得所需的输出Fastest way to fill DataTable from LINQ query using DataContext

现在,如果您真的想使用DataTable对象,那么我的建议是使用强类型DataSet。要创建一个,只需将新的DataSet对象添加到项目中,并从Server Explorer拖动表中添加,就像使用LINQ to SQL对象一样

如果可能,请评估使用DataRow的决定,而是返回LINQ To SQL生成的对象,甚至更好地创建自定义DTO对象

关于您的代码,我认为没有任何理由尝试使用Datatable对象(除非您不发布额外的代码来证明此决定)。如果您只想设置控件的DataSource属性,只需执行以下操作:

var q = from tbl in db.Table1
        select tbl;

this.myControl.DataSource = q;
this.myControl.DataBind();

如果需要,可以将结果转换为匿名对象并将其用作DataSource

var q = from tbl in db.Table1
        select new
        {
           MyNewProperty = tbl.ExistingProperty,
           AnotherProperty = tbl.MyCoolerProperty
        };

this.myControl.DataSource = q;
this.myControl.DataBind();