我有以下代码:
Client data = this.controllerPacients.getById(id).AsEnumerable()
.Select(row => new Client
{
taxcode = Convert.ToInt32(row.Field<int>("taxcode")).ToString()
})
.Single();
因此,在数据库字段taxcode
中是整数。在模型Client
中是字符串。
在尝试转换类型时,我在此行中收到错误:
System.InvalidCastException:&#39;指定的演员表无效。&#39;
附件:
我也尝试过这种方式:
DataTable data = db.GetDataTable("SELECT * FROM table where id =4");
var c = data.Rows[0].Field<int>("taxcode");
答案 0 :(得分:2)
我必须以不恰当的答案回答这个问题......我将打破你的问题并解释为什么这是一个可怕的问题......
在您的代码中:
Client data = this.controllerPacients.getById(id).AsEnumerable()
.Select(row => new Client
{
taxcode = Convert.ToInt32(row.Field<int>("taxcode")).ToString()
})
.Single();
......你没有解释任何一个。以下是一些观点:
a)controllerPacients
顺便拼写错误,是一个类级别的属性,可能会隐藏其中的强制转换,这意味着我们永远无法在堆栈溢出时看到这里的错误。您应提供完整的代码,或填写任何空白并附上说明。
b)getById(id)
会返回类似数组的类型,但我们无法看到它是什么。在这种情况下使用AnEnumerable
有一些严重的代码味道。有没有办法直接从getById结果中select
,或通过getById结果的属性访问看似是行集合的内容?
c)25,000名演员......如果该字段是int
且您的班级有string
,则只需使用.ToString()
,您就不需要进行所有这些转换。
d)您应该考虑在Client类上创建一个方法,该方法将Patient作为参数并从中加载它的值,而不是从原始Patient的数据源加载。例如Client.LoadTaxCodeFromPatient(Patient)
e)如果Single()
返回getById
以外的任何其他类,那么你必须在不应该是一个集合的末尾放一个Patient
调用出了点问题。
很抱歉这样打你的问题,但有时候我只需要:)
答案 1 :(得分:0)
解决方案是:
Client data = this.controllerPacients.getById(id).AsEnumerable().Select(row => new Client {
taxcode = Convert.ToInt32(row["taxcode"])
}).Single();
Single();
从结果DataTable中提取第一行的位置。我按字段的键获取值:
Convert.ToInt32(row["taxcode"])