DocumentDB SQL-Linq에서 SQL로 변환

DocumentDB에서는 실제로 SQL을 사용하여 문서를 쿼리합니다. .NET 개발을 수행하는 경우 사용할 수 있고 LINQ 쿼리에서 적절한 SQL을 생성 할 수있는 LINQ 공급자도 있습니다.

지원되는 데이터 유형

DocumentDB에서 모든 JSON 기본 유형은 다음과 같이 DocumentDB .NET SDK에 포함 된 LINQ 공급자에서 지원됩니다.

  • Numeric
  • Boolean
  • String
  • Null

지원되는 표현

다음 스칼라 식은 DocumentDB .NET SDK에 포함 된 LINQ 공급자에서 지원됩니다.

  • Constant Values − 원시 데이터 유형의 상수 값을 포함합니다.

  • Property/Array Index Expressions − 표현식은 객체 또는 배열 요소의 속성을 나타냅니다.

  • Arithmetic Expressions − 숫자 및 부울 값에 대한 일반적인 산술 표현식을 포함합니다.

  • String Comparison Expression − 문자열 값을 상수 문자열 값과 비교하는 것을 포함합니다.

  • Object/Array Creation Expression− 복합 값 유형 또는 익명 유형의 객체 또는 이러한 객체의 배열을 반환합니다. 이러한 값은 중첩 될 수 있습니다.

지원되는 LINQ 연산자

다음은 DocumentDB .NET SDK에 포함 된 LINQ 공급자에서 지원되는 LINQ 연산자 목록입니다.

  • Select − 프로젝션은 객체 생성을 포함한 SQL SELECT로 변환됩니다.

  • Where− 필터는 SQL WHERE로 변환되고 &&, || 사이의 변환을 지원합니다. 그리고! SQL 연산자에.

  • SelectMany− SQL JOIN 절에 배열을 해제 할 수 있습니다. 배열 요소를 필터링하기 위해 표현식을 연결 / 중첩하는 데 사용할 수 있습니다.

  • OrderBy and OrderByDescending − 오름차순 / 내림차순으로 ORDER BY로 변환합니다.

  • CompareTo− 범위 비교로 변환합니다. .NET에서 비교할 수 없기 때문에 일반적으로 문자열에 사용됩니다.

  • Take − 쿼리 결과를 제한하기 위해 SQL TOP으로 변환합니다.

  • Math Functions − .NET의 Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate에서 동등한 SQL 내장 함수로의 변환을 지원합니다.

  • String Functions − .NET의 Concat, Contains, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper에서 동등한 SQL 내장 함수로의 변환을 지원합니다.

  • Array Functions − .NET의 Concat, Contains, Count에서 동등한 SQL 내장 함수로의 변환을 지원합니다.

  • Geospatial Extension Functions − 스텁 메서드 Distance, Within, IsValid 및 IsValidDetailed에서 동등한 SQL 내장 함수로 변환을 지원합니다.

  • User-Defined Extension Function − 스텁 메서드 UserDefinedFunctionProvider.Invoke에서 해당 사용자 정의 함수로의 변환을 지원합니다.

  • Miscellaneous− 통합 및 조건부 연산자의 번역을 지원합니다. 컨텍스트에 따라 포함을 문자열 CONTAINS, ARRAY_CONTAINS 또는 SQL IN으로 변환 할 수 있습니다.

.Net SDK를 사용할 예를 살펴 보겠습니다. 다음은이 예에서 고려할 세 가지 문서입니다.

신규 고객 1

{ 
   "name": "New Customer 1", 
   "address": { 
      "addressType": "Main Office", 
      "addressLine1": "123 Main Street", 
		
      "location": { 
         "city": "Brooklyn", 
         "stateProvinceName": "New York" 
      },
	  
      "postalCode": "11229", 
      "countryRegionName": "United States" 
   }, 
}

신규 고객 2

{ 
   "name": "New Customer 2", 
	
   "address": {
      "addressType": "Main Office", 
      "addressLine1": "678 Main Street", 
		
      "location": { 
         "city": "London", 
         "stateProvinceName": " London " 
      }, 
	  
      "postalCode": "11229", 
      "countryRegionName": "United Kingdom" 
   }, 
}

신규 고객 3

{ 
   "name": "New Customer 3", 
	
   "address": { 
      "addressType": "Main Office", 
      "addressLine1": "12 Main Street", 
		
      "location": { 
         "city": "Brooklyn", 
         "stateProvinceName": "New York" 
      },
	  
      "postalCode": "11229", 
      "countryRegionName": "United States" 
   },
}

다음은 LINQ를 사용하여 쿼리하는 코드입니다. 우리는 LINQ 쿼리를 다음과 같이 정의했습니다.q하지만 .ToList를 실행할 때까지 실행되지 않습니다.

private static void QueryDocumentsWithLinq(DocumentClient client) { 
   Console.WriteLine(); 
   Console.WriteLine("**** Query Documents (LINQ) ****"); 
   Console.WriteLine();  
   Console.WriteLine("Quering for US customers (LINQ)"); 
   var q = 
      from d in client.CreateDocumentQuery<Customer>(collection.DocumentsLink) 
      where d.Address.CountryRegionName == "United States" 
		
   select new { 
      Id = d.Id, 
      Name = d.Name, 
      City = d.Address.Location.City 
   };
   
   var documents = q.ToList();  
   Console.WriteLine("Found {0} US customers", documents.Count); 
	
   foreach (var document in documents) { 
      var d = document as dynamic; 
      Console.WriteLine(" Id: {0}; Name: {1}; City: {2}", d.Id, d.Name, d.City); 
   }
   
   Console.WriteLine(); 
}

SDK는 LINQ 쿼리를 DocumentDB 용 SQL 구문으로 변환하여 LINQ 구문을 기반으로 SELECT 및 WHERE 절을 생성합니다.

CreateDocumentClient 작업에서 위의 쿼리를 호출 해 보겠습니다.

private static async Task CreateDocumentClient() { 
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      database = client.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 
         'myfirstdb'").AsEnumerable().First(); 
      collection = client.CreateDocumentCollectionQuery(database.CollectionsLink, 
         "SELECT * FROM c WHERE c.id = 'MyCollection'").AsEnumerable().First();  
      QueryDocumentsWithLinq(client); 
   } 
}

위의 코드가 실행되면 다음과 같은 출력이 생성됩니다.

**** Query Documents (LINQ) **** 
 
Quering for US customers (LINQ) 
Found 2 US customers 
   Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; City: Brooklyn 
   Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1; City: Brooklyn