2010-01-08 1 views
0

linq이 'System.Int32'형식의 개체를 캐스팅 할 수없는 이유는 무엇입니까? 'System.String'예외를 입력하십시오. 이 코드는 형식화되지 않은 DataTable에서 DataTextField 및 DataValueField를 가져 와서 KeyValuePair (string, string) 목록에 배치하는 일반 함수의 일부입니다. linq 쿼리 위의 각 루프에 대해 각 항목을 단계별로 추가했는데 제대로 작동했습니다. DataValueField에 대해 리턴 된 데이터는 숫자이지만 형식화되지 않은 세트입니다. 필드에 ToString()을 시도했는데 다음에 시도 할 항목이 무엇인지 모릅니다. 어떤 도움을 주시면 감사하겠습니다.Linq to untyped Datatable 형식의 'System.Int32'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

Private Function GetCurrentBoundControlDT(ByVal StoredProcedure As String, ByVal ParamList As String, ByVal DataTextField As String, ByVal DataValueField As String) As List(Of KeyValuePair(Of String, String)) 
     Dim ds As DataSet = Nothing 
     Dim dt As DataTable = Nothing 
     Dim BoundControlDataList As List(Of KeyValuePair(Of String, String)) = Nothing 

     If ParamList.Trim <> String.Empty Then 
      StoredProcedure = String.Format("{0} {1}", StoredProcedure, ParamList) 
     End If 

     ds = RG.GetDS(StoredProcedure) 

     If Not ds Is Nothing AndAlso ds.Tables.Count > 0 Then 
      dt = ds.Tables(0) 

      'This works fine 
      For Each r As DataRow In dt.Rows 
       Dim test1 As String = r(DataTextField) 
       Dim test2 As String = r(DataValueField) 
       Dim kv As New KeyValuePair(Of String, String)(test1, test2) 
      Next 
      'Blows up here... 
      BoundControlDataList = (From ThisTable In dt.AsEnumerable() _ 
        Select New KeyValuePair(Of String, String)(ThisTable.Field(Of String)(DataTextField).ToString(), _ 
               ThisTable.Field(Of String)(DataValueField).ToString())).ToList() 
     End If 

     Return BoundControlDataList 
    End Function 

답변

0

알아 내기 위해 관리했습니다. 정확하게는 아니지만 작동합니다. 그것은 (문자열의) 제안처럼 캐스트가 아닌 것 같습니다. 나는 (개체의) 모든 원시 데이터를 올바르게 처리해야하며 필드 주위에 Convert.ToString()을 배치하는 것이 트릭을 수행했다고 생각합니다. 다음과 같은 변화가 그 이유입니다 ...

  BoundControlDataList = (From t In dt.AsEnumerable() _ 
            Select New KeyValuePair(Of String, String)(Convert.ToString(t.Field(Of Object)(DataTextField).ToString()), _ 
            Convert.ToString(t.Field(Of Object)(DataValueField).ToString()))).ToList()