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

where 句をクエリ式で使用して、クエリ式で返されるデータ ソースの要素を指定します。The where clause is used in a query expression to specify which elements from the data source will be returned in the query expression. ブール条件 (述語) を (範囲変数で参照される) 各ソース要素に適用し、指定した条件に該当するものを返します。It applies a Boolean condition (predicate) to each source element (referenced by the range variable) and returns those for which the specified condition is true. 単一のクエリ式に複数の where 句を含めることができ、単一の句に複数の述語部分式を含めることができます。A single query expression may contain multiple where clauses and a single clause may contain multiple predicate subexpressions.

Example

次の例では、where 句で、5 未満の数値を除くすべての数値を除外します。In the following example, the where clause filters out all numbers except those that are less than five. where 句を削除すると、データ ソースのすべての数値が返されます。If you remove the where clause, all numbers from the data source would be returned. num < 5 は、各要素に適用される述語です。The expression num < 5 is the predicate that is applied to each element.

class WhereSample
{
    static void Main()
    {   
        // Simple data source. Arrays support IEnumerable<T>.
        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        // Simple query with one predicate in where clause.
        var queryLowNums =
            from num in numbers
            where num < 5
            select num;

        // Execute the query.
        foreach (var s in queryLowNums)
        {
            Console.Write(s.ToString() + " ");
        }
    }
}
//Output: 4 1 3 2 0

Example

単一の where 句内には、&& および || 演算子を使用して、必要な数の述語を指定できます。Within a single where clause, you can specify as many predicates as necessary by using the && and || operators. 次の例のクエリでは、5 未満の偶数のみを選択するために 2 つの述語を指定します。In the following example, the query specifies two predicates in order to select only the even numbers that are less than five.

class WhereSample2
{
    static void Main()
    {
        // Data source.
        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        // Create the query with two predicates in where clause.
        var queryLowNums2 =
            from num in numbers
            where num < 5 && num % 2 == 0
            select num;

        // Execute the query
        foreach (var s in queryLowNums2)
        {
            Console.Write(s.ToString() + " ");
        }
        Console.WriteLine();

        // Create the query with two where clause.
        var queryLowNums3 =
            from num in numbers
            where num < 5
            where num % 2 == 0
            select num;

        // Execute the query
        foreach (var s in queryLowNums3)
        {
            Console.Write(s.ToString() + " ");
        }

    }
}
// Output: 
// 4 2 0
// 4 2 0

Example

where 句には、ブール値を返す 1 つ以上のメソッドを含めることができます。A where clause may contain one or more methods that return Boolean values. 次の例の where 句では、範囲変数の現在の値が偶数であるか、奇数であるかを判断するためのメソッドを使用します。In the following example, the where clause uses a method to determine whether the current value of the range variable is even or odd.

class WhereSample3
{       
    static void Main()
    {
        // Data source
        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        // Create the query with a method call in the where clause.
        // Note: This won't work in LINQ to SQL unless you have a
        // stored procedure that is mapped to a method by this name.
        var queryEvenNums =
            from num in numbers
            where IsEven(num)
            select num;

         // Execute the query.
        foreach (var s in queryEvenNums)
        {
            Console.Write(s.ToString() + " ");
        }
    }

    // Method may be instance method or static method.
    static bool IsEven(int i)
    {
        return i % 2 == 0;
    }    
}
//Output: 4 8 6 2 0

解説Remarks

where 句はフィルター メカニズムです。The where clause is a filtering mechanism. クエリ式のほぼどこにでも指定できますが、最初の句や最後の句にすることはできません。It can be positioned almost anywhere in a query expression, except it cannot be the first or last clause. where 句は、ソース要素のフィルター処理をグループ化の前に行うか後に行うかによって、group 句の前または後に指定できます。A where clause may appear either before or after a group clause depending on whether you have to filter the source elements before or after they are grouped.

指定した述語がデータ ソース内の要素に対して有効でない場合は、コンパイル時エラーが発生します。If a specified predicate is not valid for the elements in the data source, a compile-time error will result. これは、LINQ で提供される厳密な型チェックの 1 つの利点です。This is one benefit of the strong type-checking provided by LINQ.

コンパイル時に、where キーワードは Where 標準クエリ演算子メソッドの呼び出しに変換されます。At compile time the where keyword is converted into a call to the Where Standard Query Operator method.

関連項目See also