2

C# で ASP.NET MVC3 アプリケーションを開発しています。

検索から取得した結果セットを適用する「絞り込み」機能をアプリケーションに実装しようとしています。

つまり、検索を実行してページの中央に結果が表示された後、ページの左側/右側に検索結果の各プロパティCheckBoxListのヘルパーを配置したいと考えています。それぞれのは、プロパティの個別の値を表します。CheckBoxCheckBoxList

たとえば、検索Productして、値がblue、redyellowColorのプロパティがある場合、テキストColorと 3 -es を各色に 1 つずつ作成します。CheckBoxListCheckBox

Web で調査した結果、このDynamic LINQライブラリが Scott Guthrie によって提供されていることがわかりました。私が見つけた最新の例/チュートリアルは 2009 年のものなので、このライブラリが実際に優れている (そして維持されている) かどうか疑問に思っていました。

後者の場合、jQueryはそのような機能を実装する最良の方法ですか?

4

5 に答える 5

5

純粋に.NETフレームワークを使用して、必要な述語式を動的に構築することで解決できます。

以下のコードサンプルを参照してください。基準に応じて、これは複数のプロパティでフィルタリングされます。IQuerable を使用したのは、これにより、Entity Framework などのリモート シナリオとしての両方のインメモリが有効になるためです。Entity Framework を使用する場合は、EntitySQL 文字列を動的に構築することもできます。私はそれがより良いパフォーマンスになることを期待しています。

関連するリフレクションのごく一部があります (GetProperty)。ただし、これは BuildPredicate メソッド内でキャッシュを実行することで改善できます。

public class Item
{
    public string Color { get; set; }
    public int Value { get; set; }
    public string Category { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var list = new List<Item>()
        {
            new Item (){ Category = "Big", Color = "Blue", Value = 5 },
            new Item (){ Category = "Small", Color = "Red", Value = 5 },
            new Item (){ Category = "Big", Color = "Green", Value = 6 },
        };

        var criteria = new Dictionary<string, object>();
        criteria["Category"] = "Big";
        criteria["Value"] = 5;

        var query = DoDynamicWhere(list.AsQueryable(), criteria);
        var result = query.ToList();
    }

    static IQueryable<T> DoDynamicWhere<T>(IQueryable<T> list, Dictionary<string, object> criteria)
    {
        var temp = list;

        //create a predicate for each supplied criterium and filter on it.
        foreach (var key in criteria.Keys)
        {
            temp = temp.Where(BuildPredicate<T>(key, criteria[key]));
        }

        return temp;
    }

    //Create i.<prop> == <value> dynamically
    static Expression<Func<TType, bool>> BuildPredicate<TType>(string property, object value)
    {
        var itemParameter = Expression.Parameter(typeof(TType), "i");

        var expression = Expression.Lambda<Func<TType, bool>>(
            Expression.Equal(
                Expression.MakeMemberAccess(
                    itemParameter,
                    typeof(TType).GetProperty(property)),
                Expression.Constant(value)
            ),
            itemParameter);

        return expression;
    }
}
于 2012-05-18T06:49:49.463 に答える
2

なぜここでDynamicLINQが必要なのかわかりません。コンパイル時にアイテムのプロパティが不明ですか?名前で特定のアイテムのプロパティにアクセスできる場合、たとえば。、 DynamicLINQvar prop = myitem['Color']は必要ありません。

結果をどのようにレンダリングするかによって異なります。一般に、目的の動作を実現する方法はたくさんあります。

  1. 完全にクライアント側。クライアント側ですべてを行う場合(データのフェッチ、レンダリング、ページング)-jQueryが最善の方法です。
  2. サーバー側+クライアント側。サーバーで結果をレンダリングする場合は、各検索結果のマークアップに(プロパティごとに)HTML属性を追加し、それらのクライアント側をフィルタリングできます。この場合の唯一の問題はページングである可能性があります(サーバー側でページングを行う場合は、現在のページのみをフィルタリングできます
  3. 完全にサーバー側。検索パラメーターを使用してフォームを投稿し、LINQを使用して検索結果を絞り込みます-既存のアイテムのプロパティをフォームの値と一致させます。

編集

私があなたである場合(そしてサーバー側で結果をフィルタリングする必要がある場合)、私は次のようなことをします:

    var filtered = myItems.Where(i => i.Properties.Match(formValues))

ここで、Matchは、指定されたプロパティのリストが指定された値と一致するかどうかをチェックする拡張メソッドです。このように単純です-動的LINQは必要ありません。

編集2

LINQクエリをデータベースクエリ(LINQ to SQL)にマップする必要がありますか?それは物事を少し複雑にするでしょうが、それでも複数の.Where(...)句を連鎖させることによって実行可能です。フィルタのプロパティをループして、.Where(...)前の反復からのクエリに追加するだけです。

于 2012-04-16T15:42:44.300 に答える
0

LINQ の実装はまだ変更されていないため、ダイナミック LINQ ライブラリを使用しても問題はありません。文字列から LINQ 式を作成するだけです。

AJAX を使用して、LINQ クエリを実行し、JSON データを返すアクション メソッドを呼び出すことができます。JQuery は、返されたデータから HTML を取り込みます。

于 2012-05-18T22:48:43.187 に答える
0

C# 4.0 の作成者によるPredicateBuilderをご覧ください。

于 2012-05-15T07:25:07.760 に答える
0

@Piotr Szmyd ですでに指摘されているように、おそらく動的な Linq は必要ありません。T のすべてのプロパティを反復処理する場合、動的 linq は必要ありません。Dynamic Linq は主に、クライアント側で完全なクエリを作成し、それを文字列形式でサーバーに送信するのに役立ちます。ただし、Mvc 4 は IQueryable を返す Api コントローラーを介したクライアント側のクエリをサポートしているため、現在は廃止されています。T のすべてのプロパティを反復処理する必要がある場合は、リフレクションを使用して、フィルタリング基準を構成する LambdaExpressions を構築することで実行できます。Expression クラスの静的メソッドでそれを行うことができます. このような静的メソッドを使用することで、 m => m.Name= "Nick" のような式を動的に作成できます...いくつかの命令を入力すると...完了し、式を既存の IQueryable に適用できます

于 2012-05-17T21:51:12.883 に答える