2

リポジトリからの製品のリストがあります。十分に単純です。次に、フィルタリングと並べ替えを追加します。ソートは、リポジトリ内で実行しても効率が向上しないため、リポジトリ外で実行される可能性があります (推測)。関心のあるレコードのみをロードしたいので、リポジトリの外でフィルタリングを行うことは想像できませんでした。フィルターデリゲートを作成してリポジトリに渡したいと思います。

以下のコードは疑似 C# コードです。ソート/フィルタリングすると、機能するコードはどのようになりますか?

以下のプロセスは、デリゲートをリポジトリに渡してフィルタリングすることを中心にしています。

Product myProduct = Repo.GetProducts( filter );

(これが MS MVC の場合、このコードはコントローラーに存在します):

フィルターをセットアップします。

//TODO: Need filter class definition
var filter = new Filter(); // made up object class for now
filter.AddCondition( field, operator, value);  // do this for each filter condition
filter.AddCondition( Product.Name, contains, "Hammer"); // Product.Name ?? (Example)

Product myProducts = Repo.GetProducts( filter ); // the Product call **FILTER**

並べ替えをセットアップします。

// TODO: Need sort class definition
var sort = new Sort(); // another made up object class for now
sort.AddOrder( field, priority, sequenceUp) // Sequence enum is ascending/descending
sort.AddOrder( Product.Name, 1, ascending) // (Example) **SORT**

myProducts.AddSort(sort);

ビュー モデルを返します。

// Next part strips off unnecessary fields for view (Presentation model)
// So we are not sending a huge data model to the view (hopefully good)
// TODO: Replace string with Service? function to extract a miniProduct from Product

MiniProduct myMinis = MakeMiniProductsFrom( myProducts);  // Service?

// Determine response type (XML, JSON, HTML View) and return appropriate data
// use "x-requested-by" as per Rob Conery noted below
if (Request.IsAjaxRequest()) return Json(myMinis);
else return View(myMinis);

ご覧のとおり、このコードにはいくつかの助けが必要です。これを機能させるソートおよびフィルタークラスコード、または外部ソースへのリンクを本当に探しています。並べ替えとフィルタリングは、DDD および設計パターン内の標準的な方法であると想定しているため、質問です。Product は昔ながらの e コマース製品であると仮定してください ;) Rob Conery の Ajax ノートはこちら

ありがとう。

4

1 に答える 1

4

理想的には、リポジトリ内で並べ替えとフィルタリングを行うことをお勧めします。これは、大規模なコレクションをロードしている場合に特に重要です。DB は、あなたが実行できるよりも効率的に並べ替えることができ、並べ替えられた結果を直接返す可能性が高いためです。

インターフェイスは、これをきれいに処理するように設計されています。IQueryable<T>これは、Entity Framework、LINQ to SQL、および LINQ プロバイダーを使用するその他のデータベースの基盤です。サポートしようとすることの良い点 (少なくともあるレベルで)IQueryable<T>は、非常に標準的な方法でリポジトリを使用できることです。たとえば、 を使用した疑似コードは次のIQueryable<T>ようになります。

IList<Product> myProducts = Repo.Products.Where( p => p.Category == theCategoryToFind ).OrderBy( p => p.Name );

または、オプションで、次のようにします。

var products = from p in Repo.Products
               where p.Category == theCategory
               order by p.Name
               select p;

LINQ 指向のデータ アクセス テクノロジのいくつかがどのように機能するかを確認することをお勧めします。Subsonic (および多くの商用オプション)などのオープン ソース オプションがかなりあります。 .

于 2010-01-05T17:51:43.690 に答える