3層のUI、サービス層、リポジトリを備えたASP.NETアプリケーションがあります。
データベース内の製品に
検索機能を実装する必要があります。ProductRepositoryは私のリポジトリクラスであり、データベースからすべての製品を取得するメソッドのシグネチャは次のとおりです。
IQueryable<Product> GetAllProducts();
したがって、私のサービスレイヤーから使用します:
IProductRepository _ProductRepository = new ProductRepository();
IQueryable<Product> products = _ProductRepository.GetAllProducts();
たとえば、価格が100IQueryable<Product> productsを超える製品、またはcolor = "yellow"の製品だけを使用して、フィルタリングしたい場合。
ProductRepositoryだから私は、次のようなメソッドを作成する代わりに、疑問に思っていました。
IQueryable<Product> GetAllProductsByColor(int colorId)
サービスレイヤーIQueryable<Product>で、パラメーターとして受け入れ、そこで直接フィルタリングを実行する一連のメソッドを作成するのが良い方法かどうか疑問に思いました。
IQueryable<Product> FilterProducts(IQueryable<Product> products, Dictionary<string, object> filters)
ここで、は(propertyName、value)でDictionary<string, string>セットを表します。
このソリューションの利点は、複数のフィルターを適用する必要がある場合IQueryable<Product>、フィルター処理された製品セット間の交差を毎回取得するのではなく、既にフィルター処理されたものを渡すだけで済むことです。
それは良い習慣ですか(コンテキストを開いたままにしている限り)、それとも多層アーキテクチャパターンによって「許可」されていませんか?