【问题标题】:LINQ to DataTable Easy and FastLINQ to DataTable 轻松快速
【发布时间】:2012-07-15 11:45:05
【问题描述】:

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

谁能帮帮我

【问题讨论】:

  • 尝试改成“var qry = from tbl in db.Table1 select tbl”;

标签: asp.net linq datatable


【解决方案1】:

这些是基本概念:

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

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

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

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

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

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

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

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

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

现在,如果您真的想使用 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();

【讨论】:

  • 完美!谢谢你。我错过了 GridView.DataBind();
  • 所以,当您编写“this.myControl,Databind()”代码时,您将控件绑定到 q,对吗?如果我对该控件的数据进行任何更改,是否将这些数据保存到数据库中?
  • 没有。为了自动保存它,您需要使用数据源控件,例如EntityDataSourceLinqDataSource 控件
【解决方案2】:

我认为这里没有必要转换成 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

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2013-02-17
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多