다음을 통해 공유


단일 테이블 쿼리(LINQ to DataSet)

업데이트: November 2007

LINQ(통합 언어 쿼리) 쿼리는 IEnumerable<T> 인터페이스 또는 IQueryable 인터페이스를 구현하는 데이터 소스에서 작동합니다. DataTable 클래스에는 두 인터페이스가 구현되어 있지 않으므로 LINQ 쿼리의 From 절에서 DataTable을 소스로 사용하려면 AsEnumerable 메서드를 호출해야 합니다.

다음 예제에서는 SalesOrderHeader 테이블에서 모든 온라인 주문을 가져와서 주문 ID, 주문 날짜 및 주문 번호를 콘솔에 출력합니다.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Select New With { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
     }

For Each onlineOrder In query
    Console.Write("Order ID: " & onlineOrder.SalesOrderID)
    Console.Write(" Order date: " & onlineOrder.OrderDate)
    Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];

var query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    select new
    {
        SalesOrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate"),
        SalesOrderNumber = order.Field<string>("SalesOrderNumber")
    };

foreach (var onlineOrder in query)
{
    Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
        onlineOrder.SalesOrderID,
        onlineOrder.OrderDate,
        onlineOrder.SalesOrderNumber);
}

지역 변수 쿼리는 표준 쿼리 연산자 또는 LINQ to DataSet의 경우 DataSet 클래스 관련 연산자에서 하나 이상의 쿼리 연산자를 적용하여 하나 이상의 정보 소스에 대해 작동하는 쿼리 식으로 초기화됩니다. 이전 예제의 쿼리 식에서는 두 개의 표준 쿼리 연산자인 Where와 Select를 사용합니다.

Where 절에서는 조건을 기준으로 시퀀스를 필터링하며, 이 경우에는 OnlineOrderFlag가 true로 설정됩니다. Select 연산자는 연산자로 전달된 인수를 캡처하는 열거 가능한 개체를 할당하고 반환합니다. 위 예제에서는 세 개의 SalesOrderID, OrderDate 및 SalesOrderNumber 속성을 가진 익명 형식이 만들어집니다. 이러한 세 속성의 값은 SalesOrderHeader 테이블에 있는 SalesOrderID, OrderDate 및 SalesOrderNumber 열의 값으로 설정됩니다.

그런 다음 foreach 루프에서는 Select에서 반환된 열거 가능한 개체를 열거하고 쿼리 결과를 생성합니다. 쿼리는 IEnumerable<T>을 구현하는 Enumerable 형식이므로 foreach 루프를 사용하는 동안 쿼리 변수가 반복될 때까지 쿼리에 대한 계산이 지연됩니다. 쿼리 계산이 지연되면 여러 차례 계산할 수 있으면서 계산할 때마다 다른 결과가 나올 수 있는 값으로 쿼리를 유지할 수 있습니다.

Field 메서드는 DataRow의 열 값에 대한 액세스를 제공하며 이전 예제에서 나오지 않은 SetFieldDataRow의 열 값을 설정합니다. Field 메서드와 SetField 메서드에서는 nullable 형식이 처리되므로 명시적으로 null 값을 검사하지 않아도 됩니다. 또한 두 메서드 모두 제네릭 메서드이므로 반환 형식을 캐스팅하지 않아도 됩니다. DataRow의 기존 열 접근자(예: o["OrderDate"])를 사용할 수도 있지만 그렇게 하려면 반환 개체를 적절한 형식으로 캐스팅해야 합니다. 열이 nullable인 경우에는 IsNull 메서드를 사용하여 값이 null인지 확인해야 합니다. 자세한 내용은 제네릭 필드 및 SetField 메서드(LINQ to DataSet)을를 참조하십시오.

Field 메서드 및 SetField 메서드의 제네릭 매개 변수 T에 지정된 데이터 형식은 내부 값의 형식과 일치해야 하며, 그렇지 않으면 InvalidCastException이 throw됩니다. 지정된 열 이름도 DataSet의 열 이름과 일치해야 하며, 그렇지 않으면 ArgumentException이 throw됩니다. 두 경우 모두 쿼리가 실행되는 런타임에 데이터 열거형에서 예외가 throw됩니다.

참고 항목

개념

크로스 테이블 쿼리(LINQ to DataSet)

형식화된 데이터 집합 쿼리

제네릭 필드 및 SetField 메서드(LINQ to DataSet)