簡単なブルートフォース/:
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;
}
どのようにそれ '静的ん:あなたは、配列やコンボボックスの順序間の依存関係が気に入らない場合は、辞書
を使用
は、あなたの代わりに辞書を使用することができますプライベートクラス() '仕事?私はそれを働かせることはできません。それは常に私にエラー "メソッドは戻り値の型を持っている必要があります"を返します –
そしてもう一つ。コードを自分のメソッド 'DoSearch()'に入れるだけで、オブジェクト参照が要求されます。私がコードを実行すると、コードが壊れ、 'set set'を静的にすると、コードがさらに破壊されます。 –
これはコンストラクタです。 'Class()'にあなたのクラスの名前を代入する必要があります。 –