方法 : 実行時に述語フィルタを動的に指定する (C# プログラミング ガイド)

更新 : 2007 年 11 月

実行時まで、where 句でソース要素に適用する必要のある述語の数がわからない場合があります。複数の述語フィルタを動的に指定する 1 つの方法は、次の例に示すように Contains メソッドを使用することです。

使用例

// To run this sample, first specify some integer values for the command line.
// The numbers 111 through 122 are all valid student IDs.
// In Visual Studio or C# Express, click on Project > Properties > Debug.
// Call the method: QueryByID(args);
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);
    }
}
/* 
 Output (depends on args):
   111 114 118

   Garcia: 114
   Garcia: 118
   Omelchenko: 111
*/

定義済みの代替クエリの中から選択する必要がある場合、switch ステートメントを使用できます。次の例では、コマンド ラインで指定されている成績または学年に応じて、studentQuery は異なる where 句を使用します。

// 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. In Visual Studio or C# Express, click on Project > Properties > Debug to specify
// command line arguments.
// 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.FirstYear
                           select student;
            break;
        case GradeLevel.ThirdYear:
            studentQuery = from student in students
                           where student.Year == GradeLevel.FirstYear
                           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);
    }
}

コードのコンパイル方法

これらの例には、「方法 : オブジェクトのコレクションを照会する (C# プログラミング ガイド)」のサンプル アプリケーションで定義されているオブジェクトへの参照があります。これらの例をコンパイルして実行するには、例をそのアプリケーションの StudentClass クラスに貼り付け、Main メソッドからそのメソッドを呼び出すコードを追加します。

独自のアプリケーションに合わせてこのメソッドを変更する場合、LINQ には .NET Framework Version 3.5 が必要なこと、および System.Core.dll への参照と System.Linq の using ディレクティブをプロジェクトに含める必要があることに注意してください。LINQ to SQL、LINQ to XML、および LINQ to DataSet の場合は、追加の using と参照も必要です。詳細については、「方法 : LINQ プロジェクトを作成する」を参照してください。

動的クエリのサンプル」のサンプルは、LINQ を使用して動的なクエリ構築を行う別の方法を示します。

参照

概念

LINQ クエリ式 (C# プログラミング ガイド)

参照

where 句 (C# リファレンス)