where 절
where 절 (C# 참조)
쿼리에서 어떤 요소를 가져올지 고르고 싶을 때, 바로 그 자리가 where 절이에요. 쿼리 식에서 where 절은 데이터 소스에서 반환할 요소를 지정해요. 각 소스 요소(범위 변수로 참조하죠)에 Boolean 조건, 즉 *조건자(predicate)*를 적용해서, 그 조건이 참인 요소만 돌려줘요. 하나의 쿼리 식에 where 절을 여러 개 넣을 수도 있고, 한 절 안에 조건자 부분식을 여러 개 넣을 수도 있어요.
출처: where clause
본문
아래 예시에서는 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보다 작은 짝수만 골라내려고 조건자를 두 개 지정했어요.
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 절에는 Boolean 값을 반환하는 메서드를 하나 이상 넣을 수도 있어요. 다음 예시에서는 범위 변수의 현재 값이 짝수인지 홀수인지를 판별하는 메서드를 where 절에서 사용해요. 주의할 점은 이 방식이 LINQ to SQL에서는 저장 프로시저에 연결된 메서드가 아니라면 동작하지 않는다는 거예요.
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 절은 말 그대로 걸러내는 장치예요. 쿼리 식 안에서 거의 어디든 위치할 수 있는데, 다만 첫 번째나 마지막 절이 될 수는 없어요. group 절 앞이나 뒤 중 어디에 두느냐는, 소스 요소를 그룹화하기 전에 걸러낼지 그 후에 걸러낼지에 따라 정하면 돼요.
데이터 소스의 요소에 맞지 않는 조건자를 지정하면 쿼리는 컴파일 시 오류를 내요. 이 오류는 LINQ가 제공하는 강력한 형식 검사의 장점 중 하나예요.
컴파일 시점에 where 키워드는 xref:System.Linq.Enumerable.Where* 표준 쿼리 연산자 메서드 호출로 변환돼요.