where 句 (C# リファレンス)
where 句はクエリ式で使用され、クエリ式でデータ ソースのどの要素が返されるようにするかを指定します。 各ソース要素 (範囲変数で参照される) にブール条件 (述語) を適用し、指定した条件に該当するものを返します。 単一のクエリ式に複数の where 句を含めることができ、単一の句に複数の述語部分式を含めることができます。
使用例
次の例の where 句は、5 未満の数値以外のすべての数値をフィルターで除外します。 where 句を削除すると、データ ソースのすべての数値が返されます。 式 num < 5 が各要素に適用される述語です。
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
単一の where 句の中で、&& 演算子と || 演算子を使用することにより、述語を必要な数だけ指定できます。 次の例のクエリは、5 未満の偶数だけを選択するために 2 つの述語を指定しています。
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
where 句には、ブール値を返すメソッドを 1 つ以上含めることができます。 次の例の where 句は、範囲変数の現在の値が偶数であるか奇数であるかを判断するためにメソッドを使用しています。
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
解説
where 句はフィルター処理機構です。 クエリ式内の最初の句と最後の句以外のほとんどどこにでも置くことができます。 where 句は、group 句の前にも後ろにも置くことができます。どちらに置くかは、ソース要素のフィルター処理をグループ化の前に行うか後に行うかによります。
指定した述語がデータ ソースの要素に対して無効だった場合、コンパイル時にエラーになります。 これは、LINQ が備えている厳密な型チェックの 1 つの利点です。
where キーワードは、コンパイル時に Where 標準クエリ演算子メソッドの呼び出しに変換されます。