2017-06-24 9 views
0

私はコンボボックスとテキストボックスを持っています。私はコンボボックス内の列を選択してから、それを検索することができます。ダイナミックLinqクエリ

「国」を選択して「オランダ」(またはその一部)というテキストボックスに入力すると、オランダに住むすべての顧客が育つはずです。

ただし、これは機能しません。

私は現在、この国をハードコードしていますが、どのようにしてそのダイナミックなものを作ったのですか?それでは、私はコンボボックスで何を選んだのですか?

これは私のコードです:

CustomerContext context = new CustomerContext(); 

IQueryable<customer> customers = from x in context.customers 
           where x.country.Contains(SearchBox.Text) 
           select x; 

答えて

1

簡単なブルートフォース/:

IQueryable<customer> customers = from x in context.customers 
           where (ComboBox.SelectedValue == "Country") && x.country.Contains(SearchBox.Text) 
           || (ComboBox.SelectedValue == "City") && x.city.Contains(SearchBox.City) 
           || (ComboBox.SelectedValue == "State") && x.state.Contains(SearchBox.State) 
           select x; 

あり、上記の溶液と何も間違っては絶対にありませんが、エンジニアの多くはので、それをプーさんくまのプーさんますそれは維持可能でもエレガントなものでもないようです。 Harumph。エレガント

ファンシー/(別称、複雑):

注:searches配列と一致したために、コンボボックス内の項目を配置する必要があります。

static private readonly Func<customer, string>[] _searches; 

static private Class() //Static constructor 
{ 
    _searches = new Func<customer,string>[] 
    { 
     (c) => customer.City, 
     (c) => customer.State, 
     (c) => customer.Country 
    } 
} 

protected virtual void DoSearch() //Handles the search event 
{ 
    var search = _searches[ComboBox.SelectedIndex]; 

    IQueryable<customer> customers = from x in context.customers 
            where search(x).Contains(SearchBox.Text) 
            select x; 
} 

ここで考えているのは、アレイに一連のラムダを設定したということです。各ラムダは顧客を入力として受け取り、そのプロパティの1つを返します。

ユーザーが検索をトリガすると、コンボボックスの序数の位置を使用して、検索するプロパティに対応するラムダ式を選択します。 LINQでラムダ式を使用すると、WHERE式はラムダによって選択されたプロパティを検索します。

static private readonly Dictionary<string, Func<customer, string>> _searches; 

static private Class() //Static constructor 
{ 
    _searches = new Dictionary<string, Func<customer,string>>(); 
    _searches.Add("City", (c) => customer.City); 
    _searches.Add("State", (c) => customer.State); 
    _searches.Add("Country", (c) => customer.Country); 
} 

protected virtual void DoSearch() //Handles the search event 
{ 
    var search = _searches[ComboBox.SelectedValue]; 

    IQueryable<customer> customers = from x in context.customers 
            where search(x).Contains(SearchBox.Text) 
            select x; 
} 
+0

どのようにそれ '静的ん:あなたは、配列やコンボボックスの順序間の依存関係が気に入らない場合は、辞書

を使用

、あなたの代わりに辞書を使用することができますプライベートクラス() '仕事?私はそれを働かせることはできません。それは常に私にエラー "メソッドは戻り値の型を持っている必要があります"を返します –

+0

そしてもう一つ。コードを自分のメソッド 'DoSearch()'に入れるだけで、オブジェクト参照が要求されます。私がコードを実行すると、コードが壊れ、 'set set'を静的にすると、コードがさらに破壊されます。 –

+0

これはコンストラクタです。 'Class()'にあなたのクラスの名前を代入する必要があります。 –