如何将Enumerable值转换为正确的格式?

时间:2017-08-15 08:41:57

标签: c# winforms c#-4.0

我有以下代码:

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;

附件:

enter image description here

我也尝试过这种方式:

DataTable data =  db.GetDataTable("SELECT * FROM table where id =4");

 var c = data.Rows[0].Field<int>("taxcode");

2 个答案:

答案 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"])