2010-04-24 37 views
0

我需要获取DataTable中列的最小DateTime值。 DataTable是从CSV文件动态生成的,因此我直到运行时才知道该列的名称。这里是我得到的代码不起作用...获取最小值 - Min() - DataTable中使用LINQ to DataSets的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; 
} 

为清楚起见,变量表已打破。我基本上需要找到其中一列的DateTime的最小值(要在运行时选择并由date_attr表示)。

我已经尝试过几种解决方案(大部分是处​​理已知列和/或非DateTime字段)。我在运行时抛出一个错误,告诉我它不能执行DateTime转换(这似乎是Linq的问题?)

我已经确认列名称的数据字符串date_attr是日期值。

UPDATE:堆栈跟踪的要求:

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? – 2010-04-24 13:38:12

回答

1

其实它看起来像你的问题不是在LINQ中,但在你的数据表中的数据。如果你的错误状态是不能做的日期时间转换,你的错误很可能在这里发生:

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内部,而是在你试图转换的实际数据中。第二个电话是异常消息,绝对是数据转换问题:

Message =“指定的转换无效”。

我刚刚双重检查,如果列类型是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()方法所支持的类型之一枚举。这是问题吗? – 2010-04-24 13:42:54

+0

@Jay不,我不能确定.NET Min支持DateTime类型。 – 2010-04-24 13:49:00

+0

好的。这可能是我的误解(我对C#比较陌生);我以为演员会为我做字符串转换为日期时间... – 2010-04-24 14:02:57