0

私は .aspx ページに DataGrid を設定しており、グリッドに表示されるデータをフィルタリングするためのドロップダウンがページにいくつかあります。LINQ を使用して、page_load およびドロップダウンの SelecedIndexChanged イベントにバインドする DataTable 内のデータをフィルター処理しようとしています。

これが私の現在のアプローチです:

Dim filteredData As DataTable = (From d In rawDataTable
                            Select d).CopyToDataTable

        If Me.cbFilter1.SelectedIndex > 0 Then

            filteredData = (From f In filteredData
                            Where f.Field(Of Date)("ADateField").Year = Me.cbFilter1.SelectedValue
                            Select f).CopyToDataTable

        End If

        If Me.cbFilter2.SelectedIndex > 0 Then

            filteredData = (From f In filteredData
                            Where f.Field(Of String)("AStringField") = Me.cbFilter2.SelectedValue
                            Select f).CopyToDataTable

        End If

        If Me.cbFilter3.SelectedIndex > 0 Then

            filteredData = (From f In filteredData
                            Where f.Field(Of Boolean)("ABooleanField") = (cbFilter3.SelectedValue = "Yes")
                            Select f).CopyToDataTable

        End If

        ' ...and finally binding my grid to filteredData

これを行うためのよりクリーンで効率的な方法はありますか? どのようにしますか?ありがとう!

4

4 に答える 4

2

それを試してみてください。

filteredData = (From f In filteredData
     Where ((Me.cbFilter1.SelectedIndex > 0 And f.Field(Of Date)("ADateField").Year = Me.cbFilter1.SelectedValue) Or _
(Me.cbFilter2.SelectedIndex > 0 And f.Field(Of String)("AStringField") = Me.cbFilter2.SelectedValue))
     Select f).CopyToDataTable
于 2012-08-14T14:35:22.873 に答える
2

なぜCopyToDataTable毎回実行するのですか?元のデータからクエリを作成し、最後にこの手順を実行します。

Dim query = From d In rawDataTable Select d

If Me.cbFilter1.SelectedIndex > 0 Then
    query = query.Where(Function(f) f.Field(Of Date)("ADateField").Year = Me.cbFilter1.SelectedValue)
End If

If Me.cbFilter2.SelectedIndex > 0 Then
    query = query.Where(Function(f) f.Field(Of String)("AStringField") = Me.cbFilter2.SelectedValue)
End If

If Me.cbFilter3.SelectedIndex > 0 Then
    query = query.Where(Function(f) f.Field(Of Boolean)("ABooleanField") = (cbFilter3.SelectedValue = "Yes"))
End If

Dim filteredData As DataTable = query.CopyToDataTable

注: このように異なる where 句を組み合わせることは完全に合法です。「And」で条件を連結したのと同じ結果になります。

于 2012-08-14T14:40:55.313 に答える
1

使用したいのは、IQueryable複数の where 句の追加を処理するためのインターフェイスです。 IQueryableWhere 句をクエリに連鎖させると同時に、結果の準備ができるまでクエリの実行を延期できます。概説した方法は、クエリを複数回実行します。その上、.CopyToDataTable毎回メソッドを呼び出しているため、パフォーマンスにさらに影響を与える可能性があります。

おそらく DataSet と DataTable から完全に離れる必要があるという事実は別として、IQueryable でそれらを使用するのに役立つ例を次に示します。

    ' Calling the AsQueryable extension method starts your query off as an IQueryable '
    Dim query = (From d In rawDataTable
                 Select d).AsQueryable()

    If Me.cbFilter1.SelectedIndex > 0 Then
        query = query.Where(Function(f) f.Field(Of Date)("ADateField") = Me.cbFilter1.SelectedValue)
    End If

    If Me.cbFilter2.SelectedIndex > 0 Then
        query = query.Where(Function(f) f.Field(Of String)("AStringField") = Me.cbFilter2.SelectedValue)
    End If

    If Me.cbFilter3.SelectedIndex > 0 Then
        query = query.Where(Function(f) f.Field(Of Boolean)("ABooleanField") = (cbFilter3.SelectedValue = "Yes"))
    End If

    ' At this point, you shouldn't even need the .CopyToDataTable() method. '
    MyGrid.DataSource = query
    MyGrid.DataBind()
于 2012-08-14T14:44:14.067 に答える
0

LINQ の代わりに、DataTable で DataView を使用します -> http://msdn.microsoft.com/en-us/library/system.data.datatable.defaultview.aspx

filteredData.DefaultView.RowFilter = "AStringField = " & Me.cbFilter2.SelectedValue

filteredData.DefaultView.RowFilter = "ADateField.Year = " & Me.cbFilter1.SelectedValue

などなど

したがって、新しいデータテーブルを作成するのではなく、フィルタリングします。

于 2012-08-14T14:33:52.640 に答える