C# 无法强制转换类型为';系统。双';输入';System.String';linq查询

C# 无法强制转换类型为';系统。双';输入';System.String';linq查询,c#,.net,linq,datatable,C#,.net,Linq,Datatable,我是Linq新手,下面的一行告诉我“无法将'System.Double'类型的对象强制转换为'System.String'类型”。我如何解决它 dt.AsEnumerable().Where(dataRow => !string.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && (dataRow.Field<int>(dc.ColumnName) ==

我是Linq新手,下面的一行告诉我“无法将'System.Double'类型的对象强制转换为'System.String'类型”。我如何解决它

dt.AsEnumerable().Where(dataRow => !string.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && (dataRow.Field<int>(dc.ColumnName) == 1)).Count() > 3
dt.AsEnumerable().Where(dataRow=>!string.IsNullOrEmpty(dataRow.Field(dc.ColumnName).First().ToString())和&(dataRow.Field(dc.ColumnName)==1)).Count()>3

我正在查询DataTable列。

您试图转换为字符串的行的数据类型为double。
它应该是
dataRow.Field(dc.ColumnName)
,而不是
dataRow.Field(dc.ColumnName)

您试图转换为字符串的行的数据类型为double。
它应该是
dataRow.Field(dc.ColumnName)
,而不是
dataRow.Field(dc.ColumnName)

我怀疑您在尝试筛选等于1的行时遇到了NullReferenceException。要避免这种情况,请使用
Field()
返回一个可为空的类型,例如:

dt.AsEnumerable()
  .Where(dataRow => dataRow.Field<double?>(dc.ColumnName) == 3m))
  .Count() > 3

我怀疑您在尝试筛选等于1的行时遇到了NullReferenceException。要避免这种情况,请使用
Field()
返回一个可为空的类型,例如:

dt.AsEnumerable()
  .Where(dataRow => dataRow.Field<double?>(dc.ColumnName) == 3m))
  .Count() > 3

首先,你可以参考这个,但我会尽量简化这个问题

如果指定的DataColumn的值为null,并且T是引用类型或可为null的类型,则返回类型将为null。Field方法不会返回值

DataRowExtensions.Field方法(DataRow,String)
它出现在.NET3.5中,它提供对行中每一列的强类型访问,并且还支持类型


因此,您可以使用Convert.ToDouble(row[“dc.ColumnName”])来避免可为空的值返回。

首先,您可以参考这一点,但我将尝试简化此问题

如果指定的DataColumn的值为null,并且T是引用类型或可为null的类型,则返回类型将为null。Field方法不会返回值

DataRowExtensions.Field方法(DataRow,String)
它出现在.NET3.5中,它提供对行中每一列的强类型访问,并且还支持类型


因此,您可以使用
Convert.ToDouble(row[“dc.ColumnName”])
来避免可为空的值返回。

不要执行该转换。显然,该字段包含一个数字,而不是字符串。你为什么要调用
dataRow.Field(dc.ColumnName)
?然后使用
dataRow.Field(dc.ColumnName)
,这样您就知道这是一个数字。您是否正在尝试检查空值?是的,正在尝试检查空值,某些记录为空。您可以使用
Field()`并检查空值。此操作有效,您可以发布为答案,我将标记为正确。谢谢,别那么做。显然,该字段包含一个数字,而不是字符串。你为什么要调用
dataRow.Field(dc.ColumnName)
?然后使用
dataRow.Field(dc.ColumnName)
,这样您就知道这是一个数字。您是否正在尝试检查空值?是的,正在尝试检查空值,某些记录为空。您可以使用
Field()`并检查空值。此操作有效,您可以发布为答案,我将标记为正确。谢谢。那么
dataRow.Field(dc.ColumnName)
dataRow.Field(dc.ColumnName)
之间有什么区别呢?“修复”不是修复(甚至没有编译),解释是错误的。不是行有类型,而是字段。如果要在答案中包含代码,应使用适当的代码标记。在编辑器的顶部应该有一个按钮,你可以使用它——只需突出显示文本并点击代码按钮,它就会标记出来。如果由于某种原因不能这样做,那么这两种方法是将代码缩进四个空格,如果它在自己的行上,或者如果它是这样内联的,那么在代码部分周围使用反勾号(``````)。我会编辑这篇文章,但我想以后会让你知道的。这样做的原因是因为它不会试图将您输入的任何内容解释为HTML,例如。谢谢Chris。我不熟悉堆栈溢出&我不知道那个。谢谢你指导我。我真的很欣赏。那么
dataRow.Field(dc.ColumnName)
dataRow.Field(dc.ColumnName)
之间有什么区别呢?这个“补丁”不是补丁(甚至没有编译),解释是错误的。不是行有类型,而是字段。如果要在答案中包含代码,应使用适当的代码标记。在编辑器的顶部应该有一个按钮,你可以使用它——只需突出显示文本并点击代码按钮,它就会标记出来。如果由于某种原因不能这样做,那么这两种方法是将代码缩进四个空格,如果它在自己的行上,或者如果它是这样内联的,那么在代码部分周围使用反勾号(``````)。我会编辑这篇文章,但我想以后会让你知道的。这样做的原因是因为它不会试图将您输入的任何内容解释为HTML,例如。谢谢Chris。我不熟悉堆栈溢出&我不知道那个。谢谢你指导我。我真的很感激。
DataRowExtensions.Field<T> Method (DataRow, String)