我正在使用实体框架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()方法创建数据表。
请让我知道我在这里做错了什么。
提前致谢
答案 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
循环中使用该查询或在此结果上调用某些方法(如First
,Single
或ToList()
之前,该查询将不会运行。如果您需要立即获得结果,请在查询结束时添加ToList()
。