実行時における述語フィルターの動的指定Dynamically specify predicate filters at runtime

where 句のソース要素に適用しなければならない述語の数が実行時までわからない場合があります。In some cases, you don't know until run time how many predicates you have to apply to source elements in the where clause. 複数の述語フィルターを動的に指定する方法として、次の例のように、Contains メソッドを使用する方法があります。One way to dynamically specify multiple predicate filters is to use the Contains method, as shown in the following example. この例は 2 段階構築になっています。The example is constructed in two ways. 最初に、プログラムで提供される値にフィルターを適用してプログラムを実行します。First, the project is run by filtering on values that are provided in the program. 次に、実行時に提供された入力を利用してプログラムをもう一度実行します。Then the project is run again by using input provided at run time.

Contains メソッドを使用してフィルター処理するにはTo filter by using the Contains method

  1. 新しいコンソール アプリケーションを開き、それに PredicateFilters という名前を付けます。Open a new console application and name it PredicateFilters.

  2. オブジェクトのコレクションを照会する」から StudentClass クラスをコピーし、クラス Program の下の名前空間 PredicateFilters に貼り付けます。Copy the StudentClass class from Query a collection of objects and paste it into namespace PredicateFilters underneath class Program. StudentClass は、Student オブジェクトの一覧を提供します。StudentClass provides a list of Student objects.

  3. StudentClassMain メソッドをコメント アウトします。Comment out the Main method in StudentClass.

  4. クラス Program を次のコードで置き換えます。Replace class Program with the following code:

    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($"{name.LastName}: {name.ID}");
            }
        }
    }
    
  5. 次の行をクラス DynamicPredicatesMain メソッドに追加します。ids の宣言の下です。Add the following line to the Main method in class DynamicPredicates, under the declaration of ids.

    QueryById(ids);
    
  6. プロジェクトを実行します。Run the project.

  7. 次の出力がコンソール ウィンドウに表示されます。The following output is displayed in a console window:

    Garcia: 114Garcia: 114

    O'Donnell: 112O'Donnell: 112

    Omelchenko: 111Omelchenko: 111

  8. 次の手順はプロジェクトをもう一度実行することですが、今度は配列 ids の代わりに実行時に提供された入力を使用します。The next step is to run the project again, this time by using input entered at run time instead of array ids. Main メソッドで QueryByID(ids)QueryByID(args) に変更します。Change QueryByID(ids) to QueryByID(args) in the Main method.

  9. コマンド ライン引数 122 117 120 115 でプロジェクトを実行します。Run the project with the command line arguments 122 117 120 115. プロジェクトが実行されると、これらの値が Main メソッドのパラメーター、args の要素になります。When the project is run, those values become elements of args, the parameter of the Main method..

  10. 次の出力がコンソール ウィンドウに表示されます。The following output is displayed in a console window:

    Adams: 120Adams: 120

    Feng: 117Feng: 117

    Garcia: 115Garcia: 115

    Tucker: 122Tucker: 122

switch ステートメントを使用してフィルター処理するにはTo filter by using a switch statement

  1. switch ステートメントを使用し、あらかじめ決定されている代替クエリから選択できます。You can use a switch statement to select among predetermined alternative queries. 次の例では、studentQuery は、実行時に指定された学年に基づき、別の where 句を使用します。In the following example, studentQuery uses a different where clause depending on which grade level, or year, is specified at run time.

  2. 次のメソッドをコピーし、クラス DynamicPredicates に貼り付けます。Copy the following method and paste it into class 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 {year}");
        foreach (Student name in studentQuery)
        {
            Console.WriteLine($"{name.LastName}: {name.ID}");
        }
    }
    
  3. Main メソッドで、QueryByID の呼び出しを次の呼び出しに置換します。この呼び出しは、args 配列の最初の要素をその引数として送信します (QueryByYear(args[0]))。In the Main method, replace the call to QueryByID with the following call, which sends the first element from the args array as its argument: QueryByYear(args[0]).

  4. 1 から 4 の整数をコマンド ライン引数としてプロジェクトを実行します。Run the project with a command line argument of an integer value between 1 and 4.

関連項目See also

統合言語クエリ (LINQ)Language Integrated Query (LINQ)
where 句where clause