Documentdb-sql-linq-to-sql-translation

提供:Dev Guides
移動先:案内検索

DocumentDB SQL-LinqからSQLへの翻訳

DocumentDBでは、実際にSQLを使用してドキュメントを照会します。 .NET開発を行っている場合は、使用でき、LINQクエリから適切なSQLを生成できるLINQプロバイダーもあります。

サポートされているデータ型

DocumentDBでは、すべてのJSONプリミティブ型は、DocumentDB .NET SDKに含まれるLINQプロバイダーでサポートされています。

  • 数値
  • ブール値
  • ひも
  • Null

サポートされている式

次のスカラー式は、DocumentDB .NET SDKに含まれているLINQプロバイダーでサポートされています。

  • 定数値-プリミティブデータ型の定数値を含みます。
  • プロパティ/配列インデックス式-式は、オブジェクトまたは配列要素のプロパティを参照します。
  • 算術式-数値およびブール値に関する一般的な算術式が含まれます。
  • 文字列比較式-文字列値と一定の文字列値の比較が含まれます。
  • オブジェクト/配列作成式-複合値型または匿名型のオブジェクト、またはそのようなオブジェクトの配列を返します。 これらの値はネストできます。

サポートされているLINQオペレーター

これは、DocumentDB .NET SDKに含まれているLINQプロバイダーでサポートされているLINQオペレーターのリストです。

  • 選択-投影は、オブジェクト構築を含むSQL SELECTに変換されます。
  • Where -フィルタはSQL WHEREに変換され、&&、||間の変換をサポートします。そして! SQLオペレーターに。
  • SelectMany -SQL JOIN句への配列の巻き戻しを許可します。 式をチェーン/ネストして、配列要素をフィルタリングするために使用できます。
  • OrderByおよびOrde​​rByDescending -ORDER BYの昇順/降順に変換します。
  • CompareTo -範囲比較に変換します。 .NETでは比較できないため、一般的に文字列に使用されます。
  • Take -クエリの結果を制限するためにSQL TOPに変換します。
  • * Math関数*-.NETのAbs、Acos、Asin、Atan、Ceiling、Cos、Exp、Floor、Log、Log10、Pow、Round、Sign、Sin、Sqrt、Tan、Truncateから同等のSQLビルトインへの変換をサポート関数。
  • 文字列関数-.NETのConcat、Contains、EndsWith、IndexOf、Count、ToLower、TrimStart、Replace、Reverse、TrimEnd、StartsWith、SubString、ToUpperから同等のSQL組み込み関数への変換をサポートします。
  • 配列関数-.NETのConcat、Contains、Countから同等のSQL組み込み関数への変換をサポートします。
  • 地理空間拡張関数-スタブメソッドDistance、Within、IsValid、およびIsValidDetailedから同等のSQL組み込み関数への変換をサポートします。
  • User-Defined Extension Function -スタブメソッドUserDefinedFunctionProvider.Invokeから対応するユーザー定義関数への変換をサポートします。
  • その他-合体演算子と条件演算子の翻訳をサポートします。 コンテキストに応じて、ContainsをString CONTAINS、ARRAY_CONTAINS、またはSQL INに変換できます。

新規顧客1

Net SDKを使用する例を見てみましょう。 以下は、この例で検討する3つのドキュメントです。.

{
   "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を使用してクエリを実行するコードです。 q でLINQクエリを定義しましたが、.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