3

我是 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]”类型。

谁能帮我

4

2 回答 2

1

我认为这里没有必要转换成 linq?因为您已经获得了数据表,并且您正在 linq-ing 并再次将其转换回 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
于 2012-07-15T12:08:57.680 回答
1

这些是基本概念:

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

  • LINQ 到对象。系统.Linq。它是 LINQ 核心,旨在与内存中的集合一起使用

  • LINQ 到 XML。System.Xml.Linq 处理 XML 文档

  • LINQ 到数据集。使用 DataTable 和 DataSet 对象

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

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

我认为您正在尝试做的是:

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

LINQ to SQL 对象和 DataRow 之间没有简单的转换,因此如果您坚持需要使用反射来获得所需的输出使用 DataContext 从 LINQ 查询填充 DataTable 的最快方法

现在,如果您真的想使用 DataTable 对象,那么我的建议是使用强类型 DataSet。要创建一个,只需将一个新的 DataSet 对象添加到您的项目中,然后从服务器资源管理器中拖动表,就像您对 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();
于 2012-07-15T12:14:21.603 回答