2008-09-17 3 views
1

私は最近、古い協議計画を格納して検索できるアプリケーション(vb.net)を作成しました。 アプリケーションがうまくいくうちに、先日、データベースを渡すためにSQL文字列を生成するルーチンを見ていて、率直に言って悪いことでした。
誰かがこれを行うより良い方法を持っているかどうかを確認するためにここに質問を投稿していました。複数のコントロールからLINQクエリを生成

テキストボックスからラジオボタンまでの範囲のコントロールを持つフォームがあります。これらのコントロールはそれぞれデータベースフィルタのようなもので、ユーザーが検索ボタンを押すとSQL文字列が表示されます(実際には私はLINQ to SQLに変更したのでLINQクエリ)は、完成したコントロールから生成されて実行されます。

問題は、これらのコントロールのそれぞれをデータベースのフィールドに照合し、「if ... then ... else」の束を一切実行せずに効率的にLINQクエリを生成することです。ステートメント。これまで、コントロールのタグプロパティを使用して、コントロールをデータベースのフィールド名にリンクしました。

これはちょっと混乱して、ごめんなさい。誰かにアイデアがあるかどうかを調べるためにそこに投げ込むだけです。

おかげ ネイサン

答えて

0

複雑なアドホッククエリタイプのものをプログラミングするとき、属性はあなたの親友になることができます。より宣言的なアプローチを取って、カスタム属性でクラス、インターフェース、プロパティを修飾してから、UIをモデルにバインドする一般的な「グルー」コードを記述します。これにより、コントローラロジックのライン数を1000に変更することなく、モデルとプレゼンテーションを柔軟に行うことができます。実際、これはMicrosoftがVisual Studioの「プロパティ」ページを構築する方法とまったく同じです。要件に応じて、お客様の製品にMicrosoftの「EnvDTE.dll」を使用することもできます。

+1

一般的な「グルー」コードの例を私に見せてもらえますか? –

+0

http://www.castleproject.org/ActiveRecord/ – slf

0

あなたは多分のIQueryableに取ると、それが保証されている場合、クエリに上タックすることができ、ユーザーコントロール内の各コントロールをラップすることができます。

だからあなたのページのコードは、

var qry = from t in _db.TableName 
     select t; 

のようなものが

IQueryable<t> addToQueryIfNeeded(IQueryable<t> qry) 
{ 
    if(should be added) 
     return from t in qry 
      where this == that 
      select t; 
    else 
     return qry 
} 

、あなたはそれぞれを通過した後、各ユーザーコントロール上のメソッドにQRYを渡すクエリが完了となり制御して、行くかもしれませんあなたは.ToList()することができます。 LINQについてのクールなことは、あなたが.ToList()または.First()になるまで何も起こりません。

+0

私はこのメソッドを気にしませんが、私はカスタムコントロールのヒープを書くのを避けることを望んでいました。 –

0

ここでのパフォーマンスについてはわかりませんが、LINQ to SQLデータコンテキストクラスを設定すると、.Select(...)または.Where(..)を使用してデータベーステーブルをクエリできます。 )。これらのいずれかのラムダ式を動的に構築できるはずです。この目的のために、ラムダ式の動的生成を調べることができます。私はダイナミックなラムダ生成まですべてを行ってきましたが、可能です。

0

これを達成する方法は100%わかりませんが、ASP.NET MVCソースではどこから始めるのがよいかわかります。最近のバージョンでは、フォーム応答を受け取り、それをLINQデータソースへの書き込みを行うヘルパーメソッドに渡すことができます。

MVCはC#だと思うので、VBの翻訳をお探しなら、.NET Reflectorを使ってVBに変換してみてください。

0

「動的な」Linqクエリを作成する方法を探していると思いますが、Hereは拡張メソッドのライブラリを使用してその方法を示す例です。これらのメソッドは、型セーフな言語演算子の代わりに文字列引数を取ります。

0

属性を使用してsfuscoのメソッドを気にしません。私は確信していない唯一のことは、どこに属性を添付するためです。なぜなら、デザイナーコード内のコントロール宣言にアタッチすると、フォームが変更されたときに再生成されます。

または私はsfuscoの方法を完全に誤解していますか?

0

私はおそらくこれを行うための正しい方法は、エクステンダー・プロバイダーになると思います:MSDN documentation

次に、あなたがフックアップするフィールド名を提供するために、エディタを使用することができますし、あなたの体質プロバイダがのIQueryableを渡すことができます< T>を開き、条件を追加して、IQueryable < T>を返します。

関連する問題