2010-04-24 1 views
0

DataTable에서 열의 최소 DateTime 값을 가져와야합니다. DataTable은 CSV 파일에서 동적으로 생성되므로 런타임까지 해당 열의 이름을 알 수 없습니다. 다음은 작동하지 않는 코드입니다 ...최소 가져 오기 - Min() - LINQ to DataSets를 사용하는 DataTable의 DateTime 열에 대해?

private DateTime GetStartDateFromCSV(string inputFile, string date_attr) 
{ 
    EnumerableRowCollection<DataRow> table = CsvStreamReader.GetDataTableFromCSV(inputFile, "input", true).AsEnumerable(); 
    DateTime dt = table.Select(record => record.Field<DateTime>(date_attr)).Min(); 
    return dt; 
} 

변수 표는 명확성을 위해 요약 한 것입니다. 기본적으로 (런타임에 선택되고 date_attr으로 표시되는) 열 중 하나에 대해 DateTime으로 최소값을 찾아야합니다.

저는 SO에서 여러 가지 해결책을 시도했습니다 (알려진 열 및/또는 비 DateTime 필드와 관련이 있음). 내가 뭘있어 런타임에 (그것은 Linq 문제가있는 것) DateTime 변환을 할 수 없다는 오류를 던졌습니다

나는에있는 열 이름에 대한 데이터가 문자열 date_attr은 날짜 값입니다.

UPDATE : 스택 트레이스의 요청에 따라이 : 문제는 Linq에있는,하지만 데이터 테이블의 데이터에없는 것처럼

System.InvalidCastException was unhandled by user code 
    Message="Specified cast is not valid." 
    Source="System.Data.DataSetExtensions" 
    StackTrace: 
     at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
     at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
     at Presenter.Views.NetworkVisualizationDetailPresenter.<>c__DisplayClass1.<GetStartDateFromCSV>b__0(DataRow t) in Presenter\Views\NetworkVisualizationDetailPresenter.cs:line 194 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.Min[TSource](IEnumerable`1 source) 
     at System.Linq.Enumerable.Min[TSource,TResult](IEnumerable`1 source, Func`2 selector) 
     atPresenter.Views.NetworkVisualizationDetailPresenter.GetStartDateFromCSV(String inputFile, String date_attr) in Presenter\Views\NetworkVisualizationDetailPresenter.cs:line 194 
     at Presenter.Views.NetworkVisualizationDetailPresenter.GetDynamicNetworkVisualizationData(String inputFile, Int32 dataMode, Int32 timeInterval, String date_attr, String entity_attr, String event_attr) in Views\NetworkVisualizationDetailPresenter.cs:line 123 
     at Presenter.Views.NetworkVisualizationDetail.Page_Load(Object sender, EventArgs e) in NetworkVisualizationDetail.aspx.cs:line 114 
     at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
     at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
     at System.Web.UI.Control.OnLoad(EventArgs e) 
     at System.Web.UI.Control.LoadRecursive() 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 
+0

모든 LINQ가 좋아하지 않는 것을 나타냅니다 것 : :)이에

변경은, 당신은 (즉, 데이터가 유효 고려) 오류를 얻을 안 DateTime에 물건 주조 ?? –

답변

1

사실 것 같습니다. 날짜 시간 변환을 할 수없는 당신의 오류 상태, 당신의 오류가 가장 가능성이 여기서 생성 된 경우 :

record.Field<DateTime>(date_attr) 

Linq에 있지이다.

모든 행이이 열에 올바른 값을 가지고 있는지 확인하십시오. 당신이 도움이 될 예외에서 스택 추적 ..

UPD 덤프 수 있다면 또한, 상기 스택 추적 업데이트를 보면 을, 나는 그것을에서 상위 2 항목을 볼 수 있습니다

at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 

이것은 문제가 linq 내부가 아니라 변환하려는 실제 데이터에 있음을 가장 확실하게 확인합니다. 두 번째 호출은 예외 메시지입니다. 확실히 데이터 변환 문제입니다.

메시지 = "지정된 캐스트가 유효하지 않습니다."

이 코드는 열 유형이 DateTime 인 경우 데이터 테이블에서 작동합니다.

table.Select(record => record.Field<DateTime>(date_attr)).Min(); 

하지만 열 유형이 문자열 인 경우 예외가 발생하며 동일한 스택 추적을 사용합니다. 내가 보게되었습니다

table.Select(record => Convert.ToDateTime(record[date_attr])).Min(); 
+0

내가 여기 보이는 경우 -> http://msdn.microsoft.com/en-us/library/system.linq.enumerable.min.aspx DateTime은 MIN() 메소드에서 지원되는 유형 중 하나가 아닙니다. 열거 가능. 이게 문제 야? –

+0

@Jay 아니, 그건 사실이 아니야. .NET Min이 DateTime 유형을 지원하는지 확실히 확인할 수 있습니다. –

+0

좋습니다.이것은 나의 오해 일 수있다 (나는 C#에 비교적 익숙하지 않다). 나는 캐스트가 나를 위해 문자열에서 datetime으로의 변환을 수행 할 것이라고 생각했습니다 ... –

관련 문제