2009-05-12 6 views
2

私は自分自身が検索条件のテキストボックスの束を持っているWinFormビジネスアプリケーション画面を開発して、検索ボタンを見つけました。これらはLinqを使って式にマップされ、Linq2Sqlレイヤーに渡されます。Linq検索画面のクエリとテキストボックスの間に簡単なバインドマップを作成するために、どのデザインパターンを使用する必要がありますか?

私は、「STARTSWITH」、「完全一致」などを「含まれ」のようなさまざまなオプションを使用して基本的なクエリにこれらのテキストボックスを「バインド」する簡単な方法を作成したいのですが...私は「何

[検索]をクリックしすると、自動的にテキストボックスがを空にして検索を実行していなかった式ツリーを生成する

SearchBinder<Customer> searchBinder = new SearchBinder<Customer>(); 
searchBinder.Bind(txtFirstName, a=>a.FirstName, SearchBinderOptions.StarsWith); 
searchBinder.Bind(txtLastName, a=>a.LastName, SearchBinderOptions.StarsWith); 
searchBinder.Bind(txtTelephone, a=>a.Phone, SearchBinderOptions.Equals); 
searchBinder.SetAction(btnSearch, MyMethodThatHandlesTheExpressionTreeAndFillsTheResults); 

:メートルの想像では、このような何か(SearchBinderTは虚数であることに注意)です。しかし、それは私の頭の中にただ一つのパターンしかありません。私は主に、迅速なアプリケーション開発に焦点を当てています。

  • これにどのようなデザインパターンを使用したいのですか(それとも良いと思いますか)?
  • あなたが(より大きい/より小さいと、日付/数字)他のデータ型を処理する方法を
+0

私はそれがかなりクールなコンセプトだと言います。 –

答えて

0

遅延実行とラムダのキャプチャ状態は、この問題を解決すると思いませんか? searchQuery以来

Predicate<Customer> searchQuery = c => { 
    c.FirstName.StartsWith(txtFirstName.Text) 
    && c.LastName.StartsWith(txtLastName.Text) 
    && c.Phone == txtTelephone.Text; 
} 

void btnSearch_Click(object sender, EventArgs e) { 
    return IEnumerable<Customer>.Where(searchQuery); 
} 

ボタンをクリックするまでは実行されず、「ビルダー」のコンポーネントとの比較アウト抽象化する必要はありません。テキストボックスへのアクセスにはマルチスレッドの問題がありますが、代わりにExpression<T>を使用し、分解してControl.Invokeで再構築することができます。または、最初にInvokeと書いてください。または、それをUIスレッドに送って実行してください。

しかし、あなたが実際にあなたのデザインに行きたいと思ったら、あなたが持っている比較演算子の代わりにExpression<T>を使うことをお勧めします。それはより柔軟性があり、仕事の良いビットを節約します。

デザインパターンに関しては、私が知る最も近いものはQuery Objectです - [N] HibernateはCriteriaの形をしています。 UI要素にバインドするのではなく、動的クエリを構築する方法について詳しく説明しています(ここでも、私はその要点を見ていません)。あなたの例では、あなたのクエリはハードコーディングされているので、何のメリットがあるのか​​は分かりません。

+0

ビルダーコンポーネントには、テキストボックスが入力されたかどうかに基づいて述部を構築するロジックがあります。空のテキストボックスをクエリから除外する必要があります。述語はそれを考慮に入れません。 – TheSoftwareJedi

+0

さて、コントロールにデータバインドされているクエリオブジェクトが必要なようです。値が空の場合は、クエリーから除外します(これは通常のクエリーオブジェクトパターンです)。 –

関連する問題