DocumentDB SQL - Traduction Linq vers SQL

Dans DocumentDB, nous utilisons en fait SQL pour interroger des documents. Si nous faisons du développement .NET, il existe également un fournisseur LINQ qui peut être utilisé et qui peut générer le SQL approprié à partir d'une requête LINQ.

Types de données pris en charge

Dans DocumentDB, tous les types primitifs JSON sont pris en charge dans le fournisseur LINQ inclus avec le SDK DocumentDB .NET, qui sont les suivants:

  • Numeric
  • Boolean
  • String
  • Null

Expression prise en charge

Les expressions scalaires suivantes sont prises en charge dans le fournisseur LINQ inclus avec le SDK DocumentDB .NET.

  • Constant Values - Inclut les valeurs constantes des types de données primitifs.

  • Property/Array Index Expressions - Les expressions font référence à la propriété d'un objet ou d'un élément de tableau.

  • Arithmetic Expressions - Inclut les expressions arithmétiques courantes sur les valeurs numériques et booléennes.

  • String Comparison Expression - Comprend la comparaison d'une valeur de chaîne à une valeur de chaîne constante.

  • Object/Array Creation Expression- Renvoie un objet de type valeur composée ou de type anonyme ou un tableau de ces objets. Ces valeurs peuvent être imbriquées.

Opérateurs LINQ pris en charge

Voici une liste des opérateurs LINQ pris en charge dans le fournisseur LINQ inclus avec le SDK DocumentDB .NET.

  • Select - Les projections se traduisent par SQL SELECT, y compris la construction d'objets.

  • Where- Les filtres se traduisent en SQL WHERE et prennent en charge la traduction entre &&, || et ! aux opérateurs SQL.

  • SelectMany- Permet le déroulement des tableaux à la clause SQL JOIN. Peut être utilisé pour chaîner / imbriquer des expressions afin de filtrer les éléments du tableau.

  • OrderBy and OrderByDescending - Se traduit par ORDER BY croissant / décroissant.

  • CompareTo- Se traduit par des comparaisons de gamme. Couramment utilisé pour les chaînes car elles ne sont pas comparables dans .NET.

  • Take - Traduit en SQL TOP pour limiter les résultats d'une requête.

  • Math Functions - Prend en charge la traduction de .NET Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate vers les fonctions intégrées SQL équivalentes.

  • String Functions - Prend en charge la traduction de .NET Concat, Contains, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper vers les fonctions intégrées SQL équivalentes.

  • Array Functions - Prend en charge la traduction de Concat, Contains et Count de .NET vers les fonctions intégrées SQL équivalentes.

  • Geospatial Extension Functions - Prend en charge la traduction des méthodes de stub Distance, Within, IsValid et IsValidDetailed vers les fonctions intégrées SQL équivalentes.

  • User-Defined Extension Function - Prend en charge la traduction de la méthode de stub UserDefinedFunctionProvider.Invoke vers la fonction définie par l'utilisateur correspondante.

  • Miscellaneous- Prend en charge la traduction des opérateurs de coalescence et conditionnels. Peut traduire Contains en String CONTAINS, ARRAY_CONTAINS ou SQL IN selon le contexte.

Jetons un coup d'œil à un exemple dans lequel nous utiliserons le SDK .Net. Voici les trois documents que nous allons considérer pour cet exemple.

Nouveau client 1

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

Nouveau client 2

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

Nouveau client 3

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

Voici le code dans lequel nous interrogeons à l'aide de LINQ. Nous avons défini une requête LINQ dansq, mais il ne s'exécutera pas tant que nous n'exécuterons pas .ToList dessus.

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(); 
}

Le SDK convertira notre requête LINQ en syntaxe SQL pour DocumentDB, générant une clause SELECT et WHERE basée sur notre syntaxe LINQ.

Appelons les requêtes ci-dessus à partir de la tâche 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); 
   } 
}

Lorsque le code ci-dessus est exécuté, il produit la sortie suivante.

**** 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