1

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-でScottGのDynamic.vb拡張機能の実装に問題があります。私のvbソリューションのquery-library.aspx 。おそらく他の方法があることは知っていますが、このアプローチは私に非常に大きな柔軟性を与えてくれます。StackOverflow(80以上のQ&A)や他の多くのサイトを検索しましたが、運が悪かったです。VS2010を使用しています。

ルート名前空間がない問題にDynamic.vbを含めてから、メインプロジェクトにそのプロジェクトへの参照を追加しました。(2つではなく)4つのオーバーロードに対してインテリセンスを取得しているので、拡張機能がスコープ内にあると確信しています。

スコットが示したように、私は条項、特にOrderByで苦労していました。スコットのVBの例のように文字列を渡すだけでは、「これらの引数でアクセス可能な「OrderBy」を呼び出すことができないため、オーバーロードの解決に失敗しました」というエラーが発生しました。

コードの行は次のとおりです。

Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                    .OrderBy("Name")

そこで、Lambda式を渡すと述べている他の参照を見つけました。だから私はこれを試しましたが、ソート機能がまだ機能していないように見えても、少なくともエラーは発生しません。コンパイルして実行するコードは次のとおりです。


    Private Sub SortByColumn()

        If Not cmbComponentFilter.SelectedItem.ToString = "All" Then
            Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                               Where Component.ComponentType.ToString = cmbComponentFilter.SelectedItem.ToString _
                               Order By Component.Name

            Dim OrderedFilteredComponentList = From Component As MX.Component In FilteredComponentList.AsQueryable _
                                               .OrderBy(Function(str) dgvComponents.Columns(e.ColumnIndex).Name)

            bsComponentList.DataSource = OrderedFilteredComponentList
            dgvComponents.DataSource = bsComponentList
        Else
            Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                        .OrderBy(Function(str) dgvComponents.Columns(e.ColumnIndex).Name)

            bsComponentList.DataSource = FilteredComponentList
            dgvComponents.DataSource = bsComponentList

        End If

    End Sub

dgvComponents.Columns(e.ColumnIndex).Nameに問い合わせると、並べ替えたいオブジェクトプロパティが表示されますが、並べ替えが機能しません。なぜスコットの実装がうまくいかないのか心配ですが、彼の基調講演を聞いたり、ブログを読んだりしているので、問題は私の実装にあると思います。

どちらかを働きたいのですが、その理由も理解する必要があります。文字列の受け渡しが機能しないのはなぜですか?関数で宣言されたPARAMARRAYはオプションではありませんか?私はこれに8時間投資しました、そして私は他の道を進むことができましたが、私はあきらめるためにこのアプローチへの答えを見つけることにあまりにもコミットしています(アプローチによる自殺協定)。

任意のガイダンスをいただければ幸いです。私は非常に意気消沈しているので、それがばかげた間違いであったとしても私を悩ませることはありません(それはしばしばそうです)。

助けてくれてありがとう。

r / Jamie

4

1 に答える 1

0

わかりました、私はばかです。含めるのを忘れました:

Imports System.Linq.Dynamic

エクステンションを使ったクラスで。これで、これはラムダ エクスプレスなしで機能します。機能する新しいコードは次のとおりです。Lambda は必要ありません。

    Private Sub SortByColumn()

    If cmbComponentFilter.SelectedItem.ToString <> "All" Then
        Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                           Where Component.ComponentType.ToString = cmbComponentFilter.SelectedItem.ToString

        Dim OrderedFilteredComponentList = From Component As MX.Component In FilteredComponentList.AsQueryable _
                                           .OrderBy(dgvComponents.Columns(e.ColumnIndex).Name)

        bsComponentList.DataSource = OrderedFilteredComponentList
        dgvComponents.DataSource = bsComponentList
    Else
        Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                    .OrderBy(dgvComponents.Columns(e.ColumnIndex).Name)

        bsComponentList.DataSource = FilteredComponentList
        dgvComponents.DataSource = bsComponentList

    End If

End Sub

拡張機能が機能するようになったので、このアプローチは多くの価値を追加し、ユーザーの選択に基づいてデータを動的に選択、並べ替え、フィルター処理するためのコーディング作業を削減すると思います。私のトラブルが、私のレベルの他の人が vb.net でこれを機能させる方法をよりよく理解するのに役立つことを願っています。

于 2012-06-20T16:04:57.263 に答える