2016-11-07 14 views
1

LINQを使用したC#での高度なフィルタリングにどのようなコードが表示されるかについて質問します。私はLinqとの経験がありますが、これは私が理解できなかったものです。linqでの高度なフィルタリング

たちは入力に自分のフィルタを持っており、彼らが必要とする結果になるだろう性質(string)Name(bool)New(int)Priceとユーザーを持つクラスItemを考えてみましょう。

私たちは5個のオブジェクトをリスト内に入れて、リストのアイテムであるlistとしましょう。

new Item("Pen",true,12); 
new Item("PostIt",false,35); 
new Item("Phone",true,140); 
new Item("Watch",true,5); 
new Item("Lavalamp",false,2); 

今、私は私が

List<Item> Results = list.where(item => item.Price> 10 && item.New).ToList(); 

でこれを行うことができます知っているが、ユーザーがすべて取得したい場合はどう10上の費用のすべての新しい時代..取得するには、この情報を処理したいとwoud新しいかどうかに関わらず10以上のコストを要する項目です。実行時にニーズに合わせてクエリを変更することはできません。入力パラメータのすべての可能な組み合わせに対してクエリを作成することは正しい方法です...誰かがこれをどうやってやるべきかの例を教えてもらえますか?

+0

これは多分ですか? [CS-Script Source](https://csscriptsource.codeplex.com/wikipage?title=Choosing%20Compiler%20Engine) – Fabio

+0

LINQは作成可能です。条件付きで他のフィルタを適用することもできますが、一度に1つずつ必要になります。単一の 'Where'ですべてを指定する必要はありません。 – Luaan

+0

[Combine LinQ queries](http://stackoverflow.com/questions/9804683/combine-linq-queries)の可能な複製です。これはクエリを組み合わせたクエリですが、それに応じて大きなリストを構築することができますさまざまな基準を適用し、それらを実行します。 – BugFinder

答えて

5

@MikeEasonは、このクエリを実行しますので、あなたがあなたの最初の結果にToList()を呼び出すにしたくない言ったようにあなたは、ベースのクエリに

var result = list.Where(item=> item.Price > 10); //DON'T Call ToList() here 

if(someCondition) 
    result = result.Where(item=> item.New); 

//in the end you are calling 

return result.ToList(); 

を定義することができます。あなたの目標は、複雑なクエリを構築し、一度だけ実行することです。そのため、これは結果を返すときに行われます。

+2

このメソッドは効果的に*クエリを構築し、 '.ToList()'にヒットしたときにのみ実行されることに注意してください。 –

+0

@MikeEasonはい私はこれを書くつもりでした。 – mybirthname

+0

ToList()は本当に問題の重要な部分ではありませんでしたが、それに気づき、答えを書くことに感謝します。私がこれを求めている理由は、最大50,60のオプションフィルタを取る可能性のあるプロジェクトです。答えをありがとう、それは私の質問に答えた! – DethoRhyne

3

あなただけ、あなたはいくつかのステップであなたのクエリを構築することができ、これらの三つの条件を持っている場合:あなたはToListメソッドを呼び出すか、あなたはdeferred executionへのクエリ結果のおかげを反復行ったとき

IEnumerable<Item> result=list; 
int Price=10; 
bool FilterByPrice, bool FilterByNew;//Set this variables in your environment 
if(FilterByPrice) 
    result=result.Where(item => item.Price> Price); 
if(FilterByNew) 
    result=result.Where(item => item.New); 

あなたのクエリが実行されます。

+0

最初は簡単な方法があると思っていましたが、これが当てはまる場合は、そこにはたくさんのifsがあります。ありがとうございました!私はあなたの答えをupvoteしますが、それはより多くのupvotesとコードが少しきれいに見えるので、答えとしてmybirthnameの答えを選択します。 – DethoRhyne

1

あなたのアイテムがデータベースに存在し、それらのアイテムをクエリしたいとします。ユーザーが新しいアイテムまたはすべてのアイテムだけを表示したい場合は、チェックボックスが表示されます。チェックボックスをオンにすると、bool値が設定されます。

//Compose the query 
var results = _db.Where(item => item.Price > 10); 
//still composing 
if(onlyNewItems) 
{ 
    results = results.Where(item => item.New); 
} 
//ToList() executes the query, data is returned; 
return results.ToList(); 

これはクエリを2回実行しません。実際には、クエリを実体化するまでは、まだそれを構成しています。今返却する場合はIQueryable<T>となります。 .ToList()に電話をした後にのみ、実際にクエリが実行され、IEnumberable<T>(この場合はList<T>)になります。

+0

説明をありがとう、私はそれを知らなかった。私はすべてのlinqクエリがクエリと見なされると思いました。 – DethoRhyne

0
List<Item> Results = list.where(item => item.Price > 10 
             && (condition ? item.New : true)).ToList(); 

このように拡張することができます。条件が偽で何も起こらない場合は、trueを渡してください。

関連する問題