C# 使用DataTable操作时,无法将lambda表达式用作动态调度操作的参数

C# 使用DataTable操作时,无法将lambda表达式用作动态调度操作的参数,c#,lambda,C#,Lambda,我试图将列的数据从数据表提取到列表。示例代码如下: List<String> userNames = dataTable.Rows.OfType<DataRow>(). Select(dr => dr.Field<string>("UserName")) .ToList(); List userNames=dataTable.

我试图将列的数据从
数据表
提取到
列表
。示例代码如下:

List<String> userNames = dataTable.Rows.OfType<DataRow>().
                                Select(dr => dr.Field<string>("UserName"))
                                .ToList();
List userNames=dataTable.Rows.OfType()。
选择(dr=>dr.Field(“用户名”))
.ToList();
我从Visual Studio 2015收到错误消息:

无法将lambda表达式用作参数 已调度的操作,而不首先将其强制转换为委托或 表达式树类型

DataTable有3行,所有数据的类型均为
字符串

谷歌搜索了几个小时,仍然无法解决这个问题。如何解决此错误


更新:@IvanStoev注意到
dataTable
是一个
动态
变量,而不是
dataTable
您的代码看起来不错,但您也可以尝试以下操作:

var userNames = (from x in dataTable.AsEnumerable()
                select x.Field<string>("UserName")).ToList();
var userNames=(来自dataTable.AsEnumerable()中的x)
选择x.Field(“用户名”).ToList();

希望这有帮助

必须对DataTable使用AsEnumerable(),然后才能对DataRows进行操作。您可以尝试以下方法:

List<String> userNames = dt.AsEnumerable().Select(dr => dr.Field<string>("UserName")).ToList();
List userNames=dt.AsEnumerable().Select(dr=>dr.Field(“用户名”)).ToList();

虽然前面已经回答了,但我认为值得一提
dynamic
在运行时评估的类型,当我们尝试使用
访问属性时,很明显会出现这种编译时错误。 例如

您必须将其转换回特定类型,如下所示:

((MyClass)temp).prop1  //   works.
在您的情况下,请尝试将dataTable强制转换回dataTable,如下所示

((DataTable)dataTable).Rows.... 

您确定此行会产生错误吗?请提供一个示例,如果
dataTable
变量的类型为
dynamic
,则我可以复制编译错误的唯一方法是。是这样吗?为什么它不是
DataTable
。我正试图通过NPOI库读取excel文件。@IvanStoev是的,它是
动态的
,不是
数据表
,我刚刚检查了代码并更新了问题,抱歉我的错误。然后将其更改为
数据表
,或者使用cast-
((数据表)数据表)。行…
这有效。尽管问题是
dataTable
是一个
动态
变量,但还是要感谢您。您已经尝试过这个方法,并且效果良好。虽然问题是
dataTable
是一个
动态
变量,但还是要谢谢你。很高兴能帮助你,不知道你是否投票赞成:)编程快乐
((DataTable)dataTable).Rows....