我正在使用C#ASP.NET项目。
我有一个MySQL表,其userid字段为int
。
现在我想使用LINQ获取userid值等于某个值的行数。
为实现这一目标,我写了以下方法:
public int getCount(int usercode) {
int count = 0;
DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable.
if (mytable.Rows.Count > 0) {
count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count();
}
return count;
}
但它显示错误System.InvalidCastException: Specified cast is not valid.
在红色突出显示区域显示count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count();
。
我不知道我在这里做错了什么。请帮忙。
答案 0 :(得分:6)
InvalidCastException
的最可能原因是x.Field<Int32>("userid")
行。如果数据的实际类型与传递给Field<T>
的类型不匹配,InvalidCastException
扩展方法将抛出Field<T>
。因此,如果userid
不是Int32
则会抛出。
修改强>
根据您的评论,userid
的类型实际上是UInt32
而不是Int32
。这就是导致问题的原因。尝试使用以下内容,它应该工作
x.Field<UInt32>("userid")
答案 1 :(得分:0)
如果不查看从数据库返回的数据,我只能猜测LINQ的以下部分是错误的:
x.Field<Int32>("userid")
你的userid列值可能不是int,我会把钱放在它上面吗?
更新:您能否确认不是正在进行的Field调用?只需在没有Field调用的情况下将代码更改为此类代码:
public int getCount(int usercode){
int count = 0;
DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable.
if (mytable.Rows.Count > 0) {
count = mytable.AsEnumerable().Count(); // No WHERE function call so no casting.
}
return count;
}
您还可以检查mytable.AsEnumerable()在监视窗口中返回的值,例如,以确保一切看起来都正确。如果上面的代码有效,那么Field调用就会爆炸。找出哪些行不能转换为Int32并从那里开始。
如果它实际上是NULL,有很多方法可以解决这个问题。
对于传递到Field中的泛型使用可空类型:
其中x.Field(“userid”)==(Int32?)usercode