다음을 통해 공유


LINQ를 사용하여 쿼리 구성

 

게시 날짜: 2017년 1월

적용 대상: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Microsoft Dynamics 365(온라인 및 온-프레미스)의 .NET LINQ(Language-Integrated Query) 쿼리 공급자는 표준 LINQ 구문을 사용합니다. LINQ 쿼리를 만드는 첫 번째 단계는 관련 엔터티 유형과 엔터티 유형 간 관계를 식별하는 것입니다. 그런 다음 데이터 원본과 다른 쿼리 매개 변수를 지정할 수 있습니다.

from 절은 단일 "루트" 엔터티를 반환하는 데 사용됩니다. 쿼리 공급자는 단일 엔터티 유형의 엔터티만 반환할 수 있습니다.orderbyselect 절은 이 루트 엔터티를 참조해야 합니다.join 절을 사용하여 관계가 있는 엔터티를 "루트" 엔터티에 추가할 수 있습니다.

이 항목의 내용

LINQ 연산자

LINQ 제한

다중 엔터티 필터

LINQ 연산자

모든 LINQ 쿼리 식에는 비슷한 형식이 있습니다. 다음 표에는 Microsoft Dynamics 365 LINQ 쿼리 공급자를 사용할 때 LINQ 쿼리 식에서 가장 많이 사용되는 절을 보여 줍니다.

LINQ 연산자

설명

예제

데이터 원본 가져오기(from 절)

생성된 서비스 컨텍스트와 초기 바인딩을 사용할 경우 생성된 컨텍스트에 AccountSet와 같이 IQueryable 엔터티 집합을 사용합니다.

생성된 컨텍스트를 사용하지 않을 경우 조직 서비스 컨텍스트 개체의 CreateQuery 메서드는 Microsoft Dynamics 365 엔터티에 대한 액세스를 제공합니다.

생성된 서비스 컨텍스트 사용:

var query1 = from c in context.ContactSet
select c;

CreateQuery 메서드 사용:

var query1 = from c in context.CreateQuery<Contact>()
select c;

join

join 절은 내부 조인을 나타냅니다. 절을 사용하여 공통 특성 값에 조인할 수 있는 두 개 이상의 엔터티를 사용합니다.

from c in context.ContactSet
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id

필터링(where 절)

where 절은 주로 부울 식을 사용하여 결과에 필터를 적용합니다. 필터는 원본 시퀀스에서 제외할 요소를 지정합니다. 각 where 절에는 단일 엔터티 유형에 대한 조건만 포함할 수 있습니다. 여러 엔터티와 관련된 복합 조건이 잘못되었습니다. 대신 각 엔터티는 별도의 where 절로 필터링해야 합니다.

from a in context.AccountSet
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")

orderby

orderby 연산자는 지정된 순서로 반환된 쿼리 특성을 배치합니다.

var query1 = from c in context.CreateQuery<Contact>()   
    orderby c.FullName ascending   
    select c;
foreach ( var q in query1)   
{
    Console.WriteLine(q.FirstName + " " + q.LastName);   
}

select

select 절은 반환되는 데이터의 양식을 정의합니다. 절은 쿼리 식의 결과에 따라 열 집합을 만듭니다. 작업할 새 개체의 인스턴스도 정의할 수 있습니다.select 절을 사용하여 새로 만든 개체는 서버에서 만들어지지 않지만 로컬 인스턴스입니다.

select new Contact   
{
    ContactId = c.ContactId,
    FirstName = c.FirstName,
    LastName = c.LastName,
    Address1_Telephone1 = c.Address1_Telephone1   
};

LINQ 제한

LINQ 쿼리 공급자는 LINQ 연산자의 하위 집합을 지원합니다. LINQ에서 표현할 수 있는 모든 조건이 지원되는 것은 아닙니다. 다음 표는 기본 LINQ 연산자의 제한 사항 중 일부를 보여 줍니다.

LINQ 연산자

제한 사항

join

외부 조인을 나타냅니다. 왼쪽 외부 조인만 사용할 수 있습니다.

from

쿼리 당 from 절 한 개를 지원합니다.

where

절의 왼쪽은 특성 이름이고 절의 오른쪽은 값이어야 합니다. 왼쪽을 상수로 설정할 수 없습니다. 절의 양쪽 모두 상수가 될 수는 없습니다.

StringContains, StartsWith, EndsWithEquals가 작동하도록 지원합니다.

groupBy

지원 안 됨. FetchXML은 LINQ 쿼리 공급자와 함께 사용할 수 없는 그룹화 옵션을 지원합니다.추가 정보: FetchXML 집계 사용

orderBy

Contact.FullName과 같은 엔터티 특성으로 정렬할 수 있습니다.

select

익명의 유형, 생성자 및 이니셜라이저를 지원합니다.

last

last 연산자는 지원되지 않습니다.

skiptake

서버 쪽 페이징을 사용하는 skiptake를 지원합니다.skip 값은 take 값보다 크거나 같아야 합니다.

aggregate

지원 안 됨. FetchXML은 LINQ 쿼리 공급자와 함께 사용할 수 없는 집계 옵션을 지원합니다.추가 정보: FetchXML 집계 사용

다중 엔터티 필터

Microsoft Dynamics 365 및 Microsoft Dynamics 365(온라인)에서 복잡한 .NET LINQ(Language-Integrated Query) 쿼리를 만들 수 있습니다. filter 절이 있는 Join 절을 여러 개 사용하여 여러 엔터티에서 특성에 대해 필터링되는 결과를 만듭니다.

다음 샘플은 두 엔터티를 사용하고 각 엔터티의 값에 따라 결과를 필터링하는 LINQ 쿼리를 만드는 방법을 보여 줍니다.


using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
 var query_where3 = from c in svcContext.ContactSet
                    join a in svcContext.AccountSet
                    on c.ContactId equals a.PrimaryContactId.Id
                    where a.Name.Contains("Contoso")
                    where c.LastName.Contains("Smith")
                    select new
                    {
                     account_name = a.Name,
                     contact_name = c.LastName
                    };

 foreach (var c in query_where3)
 {
  System.Console.WriteLine("acct: " +
   c.account_name +
   "\t\t\t" +
   "contact: " +
   c.contact_name);
 }
}

Using svcContext As New ServiceContext(_serviceProxy)
 Dim query_where3 = From c In svcContext.ContactSet _
                    Join a In svcContext.AccountSet _
                    On c.ContactId Equals a.account_primary_contact.Id _
                    Where a.Name.Contains("Contoso") _
                    Where c.LastName.Contains("Smith") _
                    Select New With {Key .account_name = a.Name,
                                     Key .contact_name = c.LastName}

 For Each c In query_where3
  Console.WriteLine("acct: " &amp; c.account_name &amp; vbTab &amp; vbTab _
                    &amp; vbTab &amp; "contact: " &amp; c.contact_name)
 Next c
End Using

참고 항목

샘플: LINQ 쿼리 만들기
샘플: 복합 LINQ 쿼리
LINQ(.NET 언어 통합 쿼리)를 사용하여 쿼리 작성
LINQ 쿼리에 런타임에 바인딩 엔터티 클래스 사용
블로그: CodePlex에서 Dynamics CRM REST/Web API용 LINQPad 4 드라이버 사용 가능

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 저작권 정보