我是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]'。
任何人都可以帮助我吗
答案 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();