DataTableでLinqを実装する方法

私は結果をDataTableの形で設定しました。 データテーブルには、 startTime endTime という2つのフィールドがあります。 私は startTime endTime フィールドで最大の違いを持つ行を取得する必要があります。

私はこれがLinqを使って簡単に実装できると思うが、データテーブルで同じことをする方法を知らない。

1
DataSet DataSet に関連付けられていますか?
追加された 著者 Enrico Campidoglio,
そのDataTable。
追加された 著者 Sumit Gupta,

3 答え

Linq To DataSet is what you are looking for.

データテーブルでAsEnumerable()を呼び出すと、通常のLinqクエリを書き込むことができます。

3
追加された
@SumitGuptaはい。私の答えを見てください。
追加された 著者 achitaka-san,
しかしここで私は開始時間と終了時間の違いで最大操作を実行したい。これはLinqを通して可能ですか?
追加された 著者 Sumit Gupta,

違いによって、 DataTable の行を並べ替えることができます EndTime フィールドと StartTime フィールドの間に挿入し、先頭から1行目を選択します。

この例では、 DataTableExtensions.AsEnumerable()を使用しています。 メソッドを使用して、 DataRow のシーケンスを取得します。指定された DataTable からオブジェクトを削除します。

var rowWithLongestTimespan = (from row in dataTable.AsEnumerable()
                              let endTime = row.Field("EndTime")
                              let startTime = row.Field("StartTime") 
                              orderby endTime - startTime descending
                              select row).First();
2
追加された
私はここでorderbyを使用しません。ソートはO(n * log(n))であり、maxはO(n)である。
追加された 著者 achitaka-san,
@ achitaka-san本当です。 IMHOこれは、 endTime startTime との差で行をグループ化し、その差がグループと等しい行を選択するなど、いくつかの選択肢よりも単純な解決策です最も高い価値を持つ。しかし、あなたが言うように、それはクエリに関係する行の数に応じて、パフォーマンスの問題を引き起こす可能性があります。
追加された 著者 Enrico Campidoglio,
        var maxDiff = dataTable
            .AsEnumerable()
            .Select(row => row.Field("endDate") - row.Field("startDate"))
            .Max();

        var allHavingMaxDiff = dataTable
            .AsEnumerable()
            .Where(row => row.Field("endDate") - row.Field("startDate") == maxDiff);

        var oneHavingMaxDiff = allHavingMaxDiff.First();
1
追加された