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 절 안에서는 &&&#124;&#124; 연산자를 이용해 조건자가 필요할 만큼 늘어놓을 수 있어요. 다음 예시에서는 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* 표준 쿼리 연산자 메서드 호출로 변환돼요.

더 알아보기