Предложение where (Справочник по C#)
Обновлен: Ноябрь 2007
Предложение where используется в выражении запроса для указания элементов, возвращаемых из источника данных, в выражении запроса. Это предложение применяет логическое условие (предикат) к каждому исходному элементу (со ссылкой переменной диапазона) и возвращает элементы, для которых заданное условие является истинным. В одном выражении запроса может присутствовать несколько предложений where, а в одном предложении – несколько частей выражения предиката.
Пример
В следующем примере предложение where фильтрует все числа за исключением тех, которые меньше пяти. Если предложение 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 можно указать столько предикатов, сколько потребуется. Для этого необходимо использовать операторы && и ||. В следующем примере в запросе указано два предиката по порядку для выбора только четных чисел, которые меньше пяти.
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() + " ");
}
}
}
// Output: 4 2 0
В предложении where может содержаться один или несколько методов, возвращающих логические значения. В следующем примере предложение 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.
Во время выполнения ключевое слово where преобразуется в вызов метода стандартного оператора запроса Where.
См. также
Основные понятия
Выражения запросов LINQ (Руководство по программированию в C#)
Ссылки
Предложение from (справочник по C#)
Предложение "select" (справочник по C#)