【问题标题】:Creating Datatable from object type LINQ从对象类型 LINQ 创建数据表
【发布时间】:2011-03-17 15:48:31
【问题描述】:

我正在使用实体框架 4.0。我正在尝试在运行时使用 LINQ 查询从我的数据库中的表创建一个 DataTable。这是一个代码:

var result = from r in DbContext.People.AsEnumerable()
      select new { r.PersonID, r.FirstName, r.LastName };

我在我的结果变量中获取数据。

IEnumerable<DataRow> drs = result as IEnumerable<DataRow>; // This line returns null

我没有在 drs 变量中获取数据行。完成上述操作后,如何使用数据表的 LoadDataRow() 方法创建数据表。

请让我知道我在这里做错了什么。

提前致谢

【问题讨论】:

标签: c# .net linq


【解决方案1】:

通过这样做:

select new { r.PersonID, r.FirstName, r.LastName };

您正在创建一个匿名类型。这不是DataRow,这就是转换失败的原因。

您需要创建新的 DataTable,然后使用存储在 result 中的结果填充它(在 foreach 循环或类似循环中)。您不能直接将其转换为 DataRow

【讨论】:

    【解决方案2】:

    result 不会是 DataRows 的可枚举;相反,它将是匿名类型的可枚举,在任何情况下都不会显式转换为 DataRow。要将匿名类型转换为 DataRow,您必须首先使用列名创建一个 DataTable,然后对于匿名类型的每个实例,将一个新 DataRow 添加到 DataTable。您不能显式地实例化新的 DataRows; DataRow 对象的结构完全依赖于其父 DataTable。

    【讨论】:

      【解决方案3】:

      首先,我假设DbContext 是数据库的EF4 上下文。那么第一件事就是,您不需要调用AsEnumerable() 方法,只需查询People 表即可。

      其次,您返回的是匿名类型,而不是 DataRow。从 EF4 查询返回时,您可以简单地返回 r 变量,它将是 People 类的实例,您可以在程序中进一步使用。如果您需要DataRow,您需要手动创建它,但如果可能的话,我建议您坚持使用 EF4 创建的对象。

      毕竟,请记住,在查询数据库时,会发生延迟执行。这意味着,在您在foreach 循环中使用它或在此结果上调用FirstSingleToList() 等一些方法之前,该查询不会运行。如果您需要立即获得结果,请在查询末尾添加ToList()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2011-02-01
        • 1970-01-01
        相关资源
        最近更新 更多