Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предложение where используется в выражении запроса, чтобы указать, какие элементы из источника данных будут возвращены в выражении запроса. Он применяет логическое условие (предикат) к каждому исходному элементу (на который ссылается переменная диапазона) и возвращает те, для которых указанное условие имеет значение true. Одно выражение запроса может содержать несколько where предложений, а одно предложение может содержать несколько вложенных выражений предиката.
Пример 1
В следующем примере предложение фильтрует все числа, 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
Пример 2
В одном 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() + " ");
}
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
Пример 3
Предложение 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) => i % 2 == 0;
}
//Output: 4 8 6 2 0
Замечания
Предложение where — это механизм фильтрации. Он может размещаться практически в любом месте выражения запроса, за исключением того, что оно не может быть первым или последним предложением. Предложение where может отображаться либо до, либо после предложения группы в зависимости от того, нужно ли фильтровать исходные элементы до или после их группировки.
Если указанный предикат недействителен для элементов источника данных, ошибка во время компиляции приведет к возникновению ошибки. Это одно из преимуществ строгой проверки типов, предоставляемой LINQ.
Во время компиляции ключевое слово where преобразуется в вызов Where метода "Стандартный оператор запросов".