다음을 통해 공유


탐색 속성

엔터티 데이터 모델의 탐색 속성은 연결의 End에서 엔터티를 찾는 데 사용되는 바로 가기 속성입니다. 탐색 속성을 사용하면 엔터티 간에 탐색하거나 연결 집합을 통해 관련 엔터티 간에 탐색할 수 있습니다. 탐색 속성은 LINQ to Entities 쿼리뿐 아니라 Entity SQL 쿼리에서 사용할 수 있습니다. 이 속성을 사용하면 조인 연산을 수행할 필요 없이 관련 엔터티에 액세스할 수 있습니다. 자세한 내용은 탐색 속성(EDM)을 참조하십시오.

메서드 기반 쿼리 구문을 사용하는 다음 예제에서는 SelectMany 메서드를 사용하여 성이 "Zhou"인 연락처의 모든 주문을 가져옵니다. Contact.SalesOrderHeader 탐색 속성을 사용하여 각 연락처의 SalesOrderHeader 개체 컬렉션을 가져옵니다.

Using AWEntities As New AdventureWorksEntities
    Dim ordersQuery = AWEntities.Contact _
    .Where(Function(c) c.LastName = "Zhou") _
    .SelectMany(Function(o) o.SalesOrderHeader)

    For Each order In ordersQuery
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
                order.SalesOrderID, order.OrderDate, order.TotalDue)
    Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> ordersQuery = AWEntities.Contact
        .Where(c => c.LastName == "Zhou")
        .SelectMany(c => c.SalesOrderHeader);

    foreach (var order in ordersQuery)
    {
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
            order.SalesOrderID, order.OrderDate, order.TotalDue);
    }
}

탐색 속성은 또한 CLR의 엔터티 인스턴스에 표시되므로 사용자는 Load 메서드를 호출하여 관련 엔터티를 로드할 수 있습니다. CLR에서 엔터티를 로드하는 경우 엔터티의 멤버에 액세스하기 전에 명시적으로 탐색 속성을 로드해야 합니다. 이러한 속성을 로드하면 데이터 소스에 대한 예기치 않은 왕복이 방지됩니다. 그러나 LINQ to Entities 쿼리는 데이터 소스에서 계산되므로 추가적인 왕복이 필요하지 않으며 보다 복잡한 탐색 식에서 속성이 자리 표시자 역할을 합니다.

연결 문자열에 MultipleActiveResultSets=True가 설정되어 있으면 foreach/For Each 루프 내부에서 명시적으로 탐색 속성을 로드할 수 있습니다. 연결 문자열에 MultipleActiveResultSets=False가 포함되어 있으면 다음 예제의 Load 메서드 호출에서 EntityCommandExecutionException을 throw합니다.

Using AWEntities As New AdventureWorksEntities()
    Dim contacts = _
        AWEntities.Contact _
        .Where(Function(c) c.LastName = "Johnson") _
        .Select(Function(c) c)

    Try
        For Each contact As Contact In contacts

            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName)

            ' Throws a EntityCommandExecutionException if 
            ' MultipleActiveResultSets is set to False in the 
            ' connection string.
            contact.SalesOrderHeader.Load()

            For Each order As SalesOrderHeader In contact.SalesOrderHeader
                Console.WriteLine("Order ID: {0}", order.SalesOrderID)
            Next

        Next
    Catch ex As EntityCommandExecutionException

        Console.WriteLine(ex.InnerException)
    End Try
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<Contact> contacts =
            AWEntities.Contact
            .Where(c => c.LastName == "Johnson")
            .Select(c => c);

    try
    {

        foreach (Contact contact in contacts)
        {
            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName);
            
            // Throws a EntityCommandExecutionException if 
            // MultipleActiveResultSets is set to False in the 
            // connection string.
            contact.SalesOrderHeader.Load();

            foreach (SalesOrderHeader order in contact.SalesOrderHeader)
            {
                Console.WriteLine("Order ID: {0}", order.SalesOrderID);
            }
        }
    }
    catch (EntityCommandExecutionException ex)
    {
        Console.WriteLine(ex.InnerException);
    }
}

참고 항목

개념

메서드 기반 쿼리 구문 예제: 관계 탐색(LINQ to Entities)
LINQ to Entities 쿼리의 식