方法 : 実行時に述語フィルターを動的に指定する (C# プログラミング ガイド)
実行時まで、where 句でソース要素に適用する必要のある述語の数がわからない場合があります。 複数の述語フィルターを動的に指定する 1 つの方法は、次の例に示すように Contains``1 メソッドを使用することです。 この例は、2 つの方法で構築されています。 まず、プログラム内で指定された値にフィルターをかけてプロジェクトを実行します。 次に、実行時に指定された入力を使用してもう一度プロジェクトを実行します。
Contains メソッドを使用してフィルターをかけるには
Visual Studio で、新しいコンソール アプリケーションを開きます。 これに「PredicateFilters」という名前を付けます。
「方法 : オブジェクトのコレクションを照会する (C# プログラミング ガイド)」から StudentClass クラスをコピーし、Program クラスの下の PredicateFilters 名前空間に貼り付けます。 StudentClass は、Student オブジェクトのリストを提供します。
StudentClass の Main メソッドをコメント アウトします。
Program クラスを次のコードで置き換えます。
class DynamicPredicates : StudentClass { static void Main(string[] args) { string[] ids = { "111", "114", "112" }; Console.WriteLine("Press any key to exit."); Console.ReadKey(); } static void QueryByID(string[] ids) { var queryNames = from student in students let i = student.ID.ToString() where ids.Contains(i) select new { student.LastName, student.ID }; foreach (var name in queryNames) { Console.WriteLine("{0}: {1}", name.LastName, name.ID); } } }
ids の宣言の下で、DynamicPredicates クラスの Main メソッドに次のコード行を追加します。
QueryById(ids);
F5 キーを押してプロジェクトを実行します。
次の出力が [コマンド プロンプト] ウィンドウに表示されます。
"Garcia: 114"
"O'Donnell: 112"
"Omelchenko: 111"
次の手順ではもう一度プロジェクトを実行しますが、今回は配列 ids ではなく、実行時に指定された入力を使用します。 ソリューション エクスプローラーで、[PredicateFilters] を右クリックし、[プロパティ] をクリックします。
[デバッグ] タブをクリックします。
[コマンド ライン引数] ウィンドウで、「122」、「117」、「120」、「115」をスペースで区切って入力します (122 117 120 115)。 プロジェクトを実行すると、これらの値は、Main メソッドのパラメーターである args の要素になります。
Main メソッドで QueryByID(ids) を QueryByID(args) に変更します。
F5 キーを押してプロジェクトを実行します。
次の出力が [コマンド プロンプト] ウィンドウに表示されます。
"Adams: 120"
"Feng: 117"
"Garcia: 115"
"Tucker: 122"
switch ステートメントを使用してフィルターをかけるには
switch ステートメントを使用すると、定義済みの代替クエリから選択できます。 次の例では、実行時に指定された学年に応じて、異なる where 句を studentQuery で使用します。
次のメソッドをコピーし、DynamicPredicates クラスに貼り付けます。
// To run this sample, first specify an integer value of 1 to 4 for the command // line. This number will be converted to a GradeLevel value that specifies which // set of students to query. // Call the method: QueryByYear(args[0]); static void QueryByYear(string level) { GradeLevel year = (GradeLevel)Convert.ToInt32(level); IEnumerable<Student> studentQuery = null; switch (year) { case GradeLevel.FirstYear: studentQuery = from student in students where student.Year == GradeLevel.FirstYear select student; break; case GradeLevel.SecondYear: studentQuery = from student in students where student.Year == GradeLevel.SecondYear select student; break; case GradeLevel.ThirdYear: studentQuery = from student in students where student.Year == GradeLevel.ThirdYear select student; break; case GradeLevel.FourthYear: studentQuery = from student in students where student.Year == GradeLevel.FourthYear select student; break; default: break; } Console.WriteLine("The following students are at level {0}", year.ToString()); foreach (Student name in studentQuery) { Console.WriteLine("{0}: {1}", name.LastName, name.ID); } }
[コマンド ライン引数] ウィンドウで、前の手順の ID 番号を 1 ~ 4 の整数値に置き換えます。
Main メソッドで、QueryByID への呼び出しを次の呼び出しに置き換えます。この呼び出しは、args 配列の最初の要素をその引数として渡します (QueryByYear(args[0]))。
F5 キーを押してプロジェクトを実行します。
このメソッドを独自のアプリケーションで使用するには
- 独自のアプリケーションに合わせてこのメソッドを変更する場合、LINQ には .NET Framework Version 3.5 または 4 が必要であること、および System.Core.dll への参照と System.Linq の using ディレクティブをプロジェクトに含める必要があることに注意してください。 LINQ to SQL、LINQ to XML、および LINQ to DataSet の型を使用するには、追加の using ディレクティブと参照も必要です。 詳細については、「方法 : LINQ プロジェクトを作成する」を参照してください。