【问题标题】:Linq: DataTable to List. Cast issueLinq:要列出的数据表。演员表问题
【发布时间】:2013-04-26 22:11:11
【问题描述】:

我收到了Specified cast is not valid.,但我找不到原因。这是我的代码。

对象层。

public class Supervisor
{
    public long ID { get; set; }
    public string stringField1 { get; set; }
    public string stringField2 { get; set; }
    public string stringField3 { get; set; }
    public int intField1{ get; set; }        
    public int intField2 { get; set; }

}

C# 方法。

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static string GetPend(string value1FromjqGrid, string value2FromjqGrid)
    {
        string query = "GetPend";
        string supervisor = "";
        Supervision _query = new Supervision();             
        DataTable dt = _query.GetSupervisorQuery(value1FromjqGrid, value2FromjqGrid, supervisor, query );
        List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
                               select new Supervisor()
                               { 
                                   ID = dt1.Field<long>("ID"),                                                                              
                                   stringField1 = dt1.Field<string>("Linea"),
                                   intField1 = dt1.Field<int>("Tiempo"),
                                   intField2 = dt1.Field<int>("TIPOACTIVIDAD_ID"),
                                   stringField2 = dt1.Field<string>("ACT_ID"),
                                   stringField3 = dt1.Field<string>("OBS")
                               }).ToList();
        var grid = new
        {
            page = 1,
            records = lines.Count(),
            total = lines.Count(),
            rows = from item in lines
                   select new
                   {
                       id = item.ID,
                       cell = new string[]{                               
                           item.stringField1,
                           item.intField1.ToString(),
                           item.intField2.ToString(),
                           item.stringField2,
                           item.stringField3
                       }
                   }
        };
        return JsonConvert.SerializeObject(grid); 
    }   

差不多就是这样。当LinQ 迭代开始时它会崩溃。 DataTable 已正确填写,正如我检查过的那样,dt1 包含正确的字段。我看到字符串列的""int's 的数字(我自己完成了SQL 存储过程,所以我也在那里进行了检查。)有了这个,我还保证来自jqGrid 没问题,但我还是在通话前发出了一些警报,是的,它们没问题。

我已经粘贴了似乎相关的代码,因为当代码尝试将信息从 DataTable 解析到 List 时出现错误,如果您需要检查此处涉及的 javascript,请让我知道,但我认为没有必要。 显然我没有看到任何东西,所以希望你能引导我朝着正确的方向前进。谢谢。

附言。我试图在 LINQPad4 上查看它,但我无法尝试,因为我不知道如何在那里表示原始 DataTable 变量。

更新

这是我扩展错误时VS给我的。:

   at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)
   at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)
   at WEB.Supervisor.<GetPend>b__b(DataRow dt1) in       E:\Dev\VS\WEB\Supervisor.aspx.cs:line 110
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at WEB.Supervisor.GetPend(String value1FromjqGrid, String value2FromjqGrid) in E:\Dev\VS\WEB\Supervisor.aspx.cs:line 109

第 109 和 110 行是这些

List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
                           select new Supervisor()

它在转换过程开始时崩溃。

更新 2

根据cmets我做了如下。

SELECT 转换为SELECT INTO 用于生成垃圾表。然后检查了它的设计,老实说,CAST(ACT_ID AS NVARCHAR(50)) 字段仍然是十进制,而不是我预期的 nvarchar。

所以,看来我必须在 LinQ 中将其作为小数处理,或者我可以做其他事情吗?我过去曾尝试与decimals 合作,但没有成功。

【问题讨论】:

  • Specified cast is not valid 整个消息是什么?堆栈跟踪?哪条线?
  • 对不起,我忘了附加它。
  • 您投射到 intlong。您确定这些字段不可为空吗?您可以尝试改用int?long?。然后你可以将item.intField1.ToString() 替换为null? null: ((int)item.intField1).ToString()
  • @Oleg 到long 的演员吸引了你的注意来自SELECT ROW_NUMBER() OVER ... AS ID。当我与其他 jqGrid 表一起工作时,如果我想使用 row_number,给它一个 long 是我唯一的选择你还这么认为吗? int? 似乎也不起作用。
  • 无论如何,它应该与GetSupervisorQuery 的某种类型不匹配。例如stringField2 = dt1.Field&lt;string&gt;("ACT_ID") 可以是整数,你应该使用stringField2 = dt1.Field&lt;int&gt;("ACT_ID")intField1 = dt1.Field&lt;int&gt;("Tiempo") 可以是字符串,你应该使用intField1 = dt1.Field&lt;string&gt;("Tiempo")

标签: c# jquery visual-studio-2010 linq jqgrid


【解决方案1】:

应该是数据库中的列类型与List&lt;Supervisor&gt; lines = (from dt1 in dt.AsEnumerable() select new Supervisor() {...}).ToList();中使用的数据类型不匹配。

在 cmets 中进行一些对话后,我们可以看到 "ACT_ID" 的类型在 database 中是十进制的。因此,要解决异常问题,可以执行以下操作:

List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
                          select new Supervisor {
                              ID = dt1.Field<long>("ID"),
                              stringField1 = dt1.Field<string>("Linea"),
                              intField1 = dt1.Field<int>("Tiempo"),
                              intField2 = dt1.Field<int>("TIPOACTIVIDAD_ID"),
                              stringField2 = dt1.Field<decimal>("ACT_ID").ToString(),
                              stringField3 = dt1.Field<string>("OBS")
                          }).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多