기본 LINQ 쿼리 작업(C#)Basic LINQ Query Operations (C#)

이 항목에서는 LINQ 쿼리 식 및 쿼리에서 수행하는 일부 일반적인 작업을 간단히 소개합니다.This topic gives a brief introduction to LINQ query expressions and some of the typical kinds of operations that you perform in a query. 자세한 내용은 다음 항목을 참조하세요.More detailed information is in the following topics:

LINQ 쿼리 식LINQ Query Expressions

표준 쿼리 연산자 개요(C#)Standard Query Operators Overview (C#)

연습: C#에서 쿼리 작성Walkthrough: Writing Queries in C#

참고

SQL 또는 XQuery와 같은 쿼리 언어를 이미 잘 알고 있으면 이 항목의 대부분을 건너뛸 수 있습니다.If you already are familiar with a query language such as SQL or XQuery, you can skip most of this topic. LINQ 쿼리 식에서 절의 순서를 알아보려면 "from 절"을 확인하세요.Read about the "from clause" in the next section to learn about the order of clauses in LINQ query expressions.

데이터 소스 가져오기Obtaining a Data Source

LINQ 쿼리에서 첫 번째 단계는 데이터 소스를 지정하는 것입니다.In a LINQ query, the first step is to specify the data source. 대부분의 프로그래밍 언어에서처럼 C#에서 변수는 선언된 후 사용되어야 합니다.In C# as in most programming languages a variable must be declared before it can be used. LINQ 쿼리에서는 데이터 소스(customers) 및 범위 변수(cust)를 소개하기 위해 from 절이 먼저 나옵니다.In a LINQ query, the from clause comes first in order to introduce the data source (customers) and the range variable (cust).

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;

쿼리 식에서는 실제 반복이 발생하지 않는다는 점을 제외하고 범위 변수는 foreach 루프의 반복 변수와 비슷합니다.The range variable is like the iteration variable in a foreach loop except that no actual iteration occurs in a query expression. 쿼리가 실행될 때 범위 변수는 customers에서 각 연속 요소에 대한 참조로 사용됩니다.When the query is executed, the range variable will serve as a reference to each successive element in customers. 컴파일러에서 cust 형식을 유추할 수 있으므로 명시적으로 지정할 필요가 없습니다.Because the compiler can infer the type of cust, you do not have to specify it explicitly. 추가 범위 변수는 let 절에 의해 소개될 수 있습니다.Additional range variables can be introduced by a let clause. 자세한 내용은 let 절을 참조하세요.For more information, see let clause.

참고

ArrayList와 같은 제네릭이 아닌 데이터 소스의 경우 범위 변수를 명시적으로 형식화해야 합니다.For non-generic data sources such as ArrayList, the range variable must be explicitly typed. 자세한 내용은 LINQ를 사용하여 ArrayList를 쿼리하는 방법(C#)from 절을 참조하세요.For more information, see How to query an ArrayList with LINQ (C#) and from clause.

필터링Filtering

대부분의 일반적인 쿼리 작업에서는 부울 식 형태로 필터를 적용합니다.Probably the most common query operation is to apply a filter in the form of a Boolean expression. 필터를 사용하면 쿼리에서는 식이 true인 요소만 반환합니다.The filter causes the query to return only those elements for which the expression is true. 결과는 where 절에 따라 반환됩니다.The result is produced by using the where clause. 적용되는 필터는 소스 시퀀스에서 제외할 요소를 지정합니다.The filter in effect specifies which elements to exclude from the source sequence. 다음 예제에서는 London에 주소가 있는 customers만 반환됩니다.In the following example, only those customers who have an address in London are returned.

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;

친숙한 C# 논리 ANDOR 연산자를 사용하여 where 절에서 필요한 만큼 필터 식을 적용할 수 있습니다.You can use the familiar C# logical AND and OR operators to apply as many filter expressions as necessary in the where clause. 예를 들어 "London"에 있고(AND) 이름이 "Devon"인 고객만 반환하려면 다음 코드를 작성합니다.For example, to return only customers from "London" AND whose name is "Devon" you would write the following code:

where cust.City == "London" && cust.Name == "Devon"

London 또는 Paris에 있는 고객을 반환하려면 다음 코드를 작성합니다.To return customers from London or Paris, you would write the following code:

where cust.City == "London" || cust.City == "Paris"

자세한 내용은 where 절을 참조하세요.For more information, see where clause.

순서 지정Ordering

보통 반환된 데이터를 정렬하는 것이 편리합니다.Often it is convenient to sort the returned data. orderby 절을 사용하면 반환된 시퀀스의 요소가 정렬되는 형식의 기본 비교자에 따라 정렬됩니다.The orderby clause will cause the elements in the returned sequence to be sorted according to the default comparer for the type being sorted. 예를 들어 Name 속성에 따라 결과를 정렬하도록 다음 쿼리를 확장할 수 있습니다.For example, the following query can be extended to sort the results based on the Name property. Name이 문자열이면 기본 비교자는 A에서 Z까지 사전순 정렬을 수행합니다.Because Name is a string, the default comparer performs an alphabetical sort from A to Z.

var queryLondonCustomers3 =
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;

결과를 역순으로 정렬하려면 orderby…descending 절을 사용합니다.To order the results in reverse order, from Z to A, use the orderby…descending clause.

자세한 내용은 orderby 절을 참조하세요.For more information, see orderby clause.

그룹화Grouping

group 절을 사용하면 지정한 키를 기준으로 결과를 그룹화할 수 있습니다.The group clause enables you to group your results based on a key that you specify. 예를 들어 결과가 City별로 그룹화되어 London 또는 Paris의 모든 고객이 개별 그룹에 포함되도록 지정할 수 있습니다.For example you could specify that the results should be grouped by the City so that all customers from London or Paris are in individual groups. 이 경우 cust.City가 키입니다.In this case, cust.City is the key.

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }

쿼리를 group 절로 종료하면 결과에 여러 목록으로 구성된 목록 형식이 사용됩니다.When you end a query with a group clause, your results take the form of a list of lists. 목록의 각 요소는 Key 멤버 및 해당 키로 그룹화된 요소 목록이 포함된 개체입니다.Each element in the list is an object that has a Key member and a list of elements that are grouped under that key. 그룹 시퀀스를 생성하는 쿼리를 반복할 경우 중첩된 foreach 루프를 사용해야 합니다.When you iterate over a query that produces a sequence of groups, you must use a nested foreach loop. 외부 루프는 각 그룹을 반복하고 내부 루프는 각 그룹의 멤버를 반복합니다.The outer loop iterates over each group, and the inner loop iterates over each group's members.

그룹 작업의 결과를 참조해야 할 경우 into 키워드를 사용하여 추가로 쿼리될 수 있는 식별자를 만들 수 있습니다.If you must refer to the results of a group operation, you can use the into keyword to create an identifier that can be queried further. 다음 쿼리는 세 명 이상의 고객이 포함된 그룹만 반환합니다.The following query returns only those groups that contain more than two customers:

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;

자세한 내용은 group 절을 참조하세요.For more information, see group clause.

조인Joining

조인 작업은 데이터 소스에서 명시적으로 모델링되지 않은 시퀀스 간 연결을 만듭니다.Join operations create associations between sequences that are not explicitly modeled in the data sources. 예를 들어 같은 위치를 가진 모든 고객 및 배포자를 찾는 조인을 수행할 수 있습니다.For example you can perform a join to find all the customers and distributors who have the same location. LINQ에서 join 절은 항상 직접 데이터베이스 테이블이 아닌 개체 컬렉션에 대해 작동합니다.In LINQ the join clause always works against object collections instead of database tables directly.

var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };

LINQ의 외래 키는 개체 모델에서 항목 컬렉션을 포함하는 속성으로 표현되므로 LINQ에서는 SQL에서처럼 자주 join을 사용할 필요가 없습니다.In LINQ, you do not have to use join as often as you do in SQL, because foreign keys in LINQ are represented in the object model as properties that hold a collection of items. 예를 들어 Customer 개체에는 Order 개체의 컬렉션이 포함됩니다.For example, a Customer object contains a collection of Order objects. 조인을 수행하지 않고 점 표기법을 사용하여 주문에 액세스합니다.Rather than performing a join, you access the orders by using dot notation:

from order in Customer.Orders...  

자세한 내용은 join 절을 참조하세요.For more information, see join clause.

선택(프로젝션)Selecting (Projections)

select 절은 쿼리 결과를 생성하고 각 반환된 요소의 “모양" 또는 형식을 지정합니다.The select clause produces the results of the query and specifies the "shape" or type of each returned element. 예를 들어 결과가 계산 또는 새 개체 만들기에 따라 전체 Customer 개체, 하나의 멤버만, 멤버 하위 집합 또는 일부 완전히 다른 결과 형식으로 구성될지 지정할 수 있습니다.For example, you can specify whether your results will consist of complete Customer objects, just one member, a subset of members, or some completely different result type based on a computation or new object creation. select 절이 소스 요소의 복사본이 아닌 다른 항목을 생성하는 경우 이 작업을 프로젝션이라고 합니다.When the select clause produces something other than a copy of the source element, the operation is called a projection. 프로젝션을 사용하여 데이터를 변환하는 것은 LINQ 쿼리 식의 강력한 기능입니다.The use of projections to transform data is a powerful capability of LINQ query expressions. 자세한 내용은 LINQ를 통한 데이터 변환(C#)select 절을 참조하세요.For more information, see Data Transformations with LINQ (C#) and select clause.

참조See also