データアクセス層(SQL、Xml ...)を完全に抽象化した基本的な3層アプリケーション(UI-サービス-データアクセス)を想定しています。
UIアプリケーションは、多基準フィルター、検索などを備えたデータグリッドで構成されています。
したがって、パラメータとしてすべての可能な基準を使用して複数のサービスメソッドを作成する必要なしに、このアーキテクチャで複数基準クエリを処理する方法...
UI層はDALがどのように機能するかを知らないことに注意してください。
データアクセス層(SQL、Xml ...)を完全に抽象化した基本的な3層アプリケーション(UI-サービス-データアクセス)を想定しています。
UIアプリケーションは、多基準フィルター、検索などを備えたデータグリッドで構成されています。
したがって、パラメータとしてすべての可能な基準を使用して複数のサービスメソッドを作成する必要なしに、このアーキテクチャで複数基準クエリを処理する方法...
UI層はDALがどのように機能するかを知らないことに注意してください。
それがDTOの目的です。
フィルタする基準ごとにKeyValuePairのようなものを保持するオブジェクトを作成できます。DALは、そこからwhere条件を構築できます。
このような:
class MultiCriteriaFiltering
{
List<FilterCriteria> Criterias;
// this method just sits here for simplicity - it should be in your DAL, not the DTO
string BuildWhereCondition()
{
StringBuilder condition = new StringBuilder();
condition.Append("WHERE (1=1) "
foreach (FilterCriteria criteria in Criterias)
{
condition.Append(" AND ").Append(criteria.FieldName).Append(" = ");
condition.Append("'").Append(criteria.FilterValue).Append("'");
}
return condition.ToString();
}
}
class FilterCriteria
{
string FieldName { get; set; }
object FilterValue { get; set; }
}
これを非常に簡単に拡張できます。たとえば、FilterCriteriaクラスに「演算子」フィールドを追加して、完全一致よりも多くのフィルタリングオプションを使用できるようにします。
これがあなたが探しているものかどうかはわかりませんが、DAL をファクトリとして使用して、さまざまなフィルター条件をカプセル化する合理的なパブリック プロパティやメソッドを使用して、DAL 対応オブジェクトを作成します。
DAL にオブジェクトを作成するように依頼し、必要に応じてフィルター基準を編集し、それを返し、指定されたアクセス方法に必要な方法で DAL にオブジェクトを処理させます。
もちろん、これは、完全に自由なデータ構造を持っていないことを前提としています...可能なフィルター基準の既知の適切なサイズのセットがあることを前提としています。未知のデータ構造に対して任意のフィルター基準を渡すことができるように柔軟にする必要がある場合、これはおそらく解決策ではありません。
Rob のStorefront チュートリアルをご覧ください。DAL からサービス レイヤーを介して渡され、UI レイヤーでも使用されるモデルを使用します。これは問題ありません。UI が DAL の実装方法を認識できないという要件を破ることはありません。サード パーティのアプリがサービス レイヤーにアクセスする必要があり、DAL がどのように機能するかを認識しない場合は、ドメイン モデルを別の VS プロジェクトに簡単に移動できます。
この回答には、LinqToSql の関数を上位層で抽象化する方法に関する詳細が記載されています。私のように、LinqToSql の遅延実行機能が気に入っているが、アプリをデータ プロバイダーとして LinqToSql に依存させたくない場合は、これを実行することをお勧めします。
subsonic を使用し、where 句のコレクションをサービス メソッドに渡します。
これには Query-By-Example を使用するのが好きです。これは、実際の例の DTO を渡すことができる場所であり、デフォルト値以外のフィールドはクエリの基準を表します。
例えば
CustomerDTO example = new CustomerDTO();
example.lastName = "jones";
AddressDTO exAddr = new AddressDTO();
exAddr.city = "Boston";
example.addresses.add(exAddr);
var customers = svc.GetCustomersLike(example);
これは、サービス層から、または上位層からも使用できます。