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基本的に、列の1つ(実行時に選択され、で表される)の最小値を見つける必要があります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内ではなく、変換しようとしている実際のデータにあることを最も確実に確認します。2番目の呼び出しは例外メッセージであり、間違いなくデータ変換の問題です。

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 に答える