从对象类型LINQ创建数据表

时间:2011-03-17 15:48:31

标签: c# .net linq

我正在使用实体框架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变量中获取数据行。完成上述操作后,如何使用datatable的LoadDataRow()方法创建数据表。

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

提前致谢

3 个答案:

答案 0 :(得分:2)

通过这样做:

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

您正在制作匿名类型。这不是DataRow,这就是您转换失败的原因。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

在完成所有这些之后,请记住,在查询数据库时,会发生延迟执行。这意味着,在foreach循环中使用该查询或在此结果上调用某些方法(如FirstSingleToList()之前,该查询将不会运行。如果您需要立即获得结果,请在查询结束时添加ToList()