0

我需要获取 DataTable 中列的最小 DateTime 值。DataTable 是从 CSV 文件动态生成的,因此直到运行时我才知道该列的名称。这是我的代码不起作用...

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)。

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

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

更新:按要求进行堆栈跟踪:

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: 
4

1 回答 1

1

实际上,您的问题似乎不在 Linq 中,而是在数据表中的数据中。如果您的错误表明无法进行 DateTime 转换,则您的错误很可能在此处生成:

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();
于 2010-04-24T13:06:16.797 回答