diff --git a/.gitignore b/.gitignore index f1e3d20..5f3a86c 100644 --- a/.gitignore +++ b/.gitignore @@ -250,3 +250,4 @@ paket-files/ # JetBrains Rider .idea/ *.sln.iml +/azure-documentdb-odata-sql/nuget.exe diff --git a/README.md b/README.md index c42e6ef..10c2296 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ The above query will then be translated to DocumentDB SQL: ``` SELECT TOP 5 c.revenue FROM c WHERE CONTAINS(c.englishName,'Limited') ORDER BY c.countryCode DESC ``` +Note: requires Microsoft.AspNet.OData 6.1.0.0 and .NET Framework 4.62 ### Supported OData to DocumentDB SQL mappings: @@ -32,7 +33,17 @@ SELECT TOP 5 c.revenue FROM c WHERE CONTAINS(c.englishName,'Limited') ORDER BY c [$orderby](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html#_The_$select_System_1) => ORDER BY +[$count](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html#_The_$inlinecount_System) => COUNT(1) + +### Built-in Operators +Items/any(d:d/Quantity gt 100) => JOIN a in c.Items WHERE a.Quantity > 100 +Note: If more objects in 'Items' qualify for the expression, duplicate results may result. e.g. +SELECT value c FROM c +JOIN a IN c.sub +WHERE a.v=false might return c twice, while c exists once, because the join in 'sub' has two hits + #### Built-in Query Functions + contains()(field, 'value') => CONTAINS(c.field, 'value') startswith()(field, 'value') => STARTSWITH(c.field, 'value') @@ -53,6 +64,10 @@ trim(field) => LTRIM(RTRIM(c.englishName)) concat(field,'value') => CONCAT(c.englishName,'value') +geo.distance(field, geography'POINT(30 10)') => ST_DISTANCE(c.location,{"type":"Point","coordinates":[30,10]}) + +geo.intersects(field, geography'POLYGON((30 10, 10 20, 20 40, 40 40, 30 10))') => ST_INTERSECTS(c.area,{"type":"Polygon","coordinates":[[[30,10],[10.20],[20,40],[40,40],[30,10]]]}) + ## Installing The nuget package of this project is published on Nuget.org [Download Page](https://www.nuget.org/packages/Microsoft.Azure.Documents.OData.Sql/). To install in Visual Studio Package Manager Console, run command: @@ -93,3 +108,5 @@ The options can be combined with bit operators such as ```(TranslateOptions.SELE ## Authors * **Ziyou Zheng** - Microsoft Universal Store Team - +* **Egbert Nierop** - Free Lance developer - Added any functionality 2017 oct 13. note: all-functionality not supported. +* **ntanaka** - Added $count, geography'POINT and geography'POLYGON( translations \ No newline at end of file diff --git a/azure-documentdb-odata-sql-samples/ODataToSqlSamples.cs b/azure-documentdb-odata-sql-samples/ODataToSqlSamples.cs index 05a6289..8345034 100644 --- a/azure-documentdb-odata-sql-samples/ODataToSqlSamples.cs +++ b/azure-documentdb-odata-sql-samples/ODataToSqlSamples.cs @@ -7,6 +7,7 @@ using Microsoft.Azure.Documents.OData.Sql; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Web.OData.Extensions; namespace azure_documentdb_odata_sql_tests { @@ -40,8 +41,13 @@ public static void ClassInitialize(TestContext testContext) [TestInitialize()] public void TestInitialize() { - httpRequestMessage = new HttpRequestMessage(); - httpRequestMessage.Method = HttpMethod.Get; + httpRequestMessage = new HttpRequestMessage + { + Method = HttpMethod.Get + }; + var config = new System.Web.Http.HttpConfiguration(); + config.EnableDependencyInjection(); + httpRequestMessage.SetConfiguration(config); } [TestMethod] @@ -76,7 +82,26 @@ public void TranslateSelectWithEnumSample() var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.SELECT_CLAUSE); Assert.AreEqual("SELECT c.enumNumber, c.id FROM c ", sqlQuery); } + [TestMethod] + public void TranslateAnySample() + { + httpRequestMessage.RequestUri = new Uri("http://localhost/User?$filter=companies/any(p: p/id eq 'abc' or p/name eq 'blaat')"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.SELECT_CLAUSE | TranslateOptions.WHERE_CLAUSE); + Assert.AreEqual("SELECT VALUE c FROM c JOIN a IN c.companies WHERE a.id = 'abc' OR a.name = 'blaat'", sqlQuery); + } + [TestMethod] + public void TranslateAnySampleWithMultipleClauses() + { + httpRequestMessage.RequestUri = new Uri("http://localhost/User?$filter=(companies/any(p: p/id eq 'abc' or p/name eq 'blaat')) and customers/any(x: x/customer_name eq 'jaap')"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.SELECT_CLAUSE | TranslateOptions.WHERE_CLAUSE); + Assert.AreEqual("SELECT VALUE c FROM c JOIN a IN c.companies JOIN b IN c.customers WHERE a.id = 'abc' OR a.name = 'blaat' AND b.customer_name = 'jaap'", sqlQuery); + } [TestMethod] public void TranslateSelectAllTopSample() { @@ -107,7 +132,18 @@ public void TranslateWhereSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.WHERE_CLAUSE); - Assert.AreEqual("WHERE c.englishName = 'Microsoft' AND c.intField <= 5 ", sqlQuery); + Assert.AreEqual("WHERE c.englishName = 'Microsoft' AND c.intField <= 5", sqlQuery); + } + + [TestMethod] + public void TranslateWhereSampleWithGUID() + { + httpRequestMessage.RequestUri = new Uri("http://localhost?$filter=id eq 2ED27DF5-F505-4A06-B168-7321C6B4AD0C"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.WHERE_CLAUSE); + Assert.AreEqual("WHERE c.id = '2ed27df5-f505-4a06-b168-7321c6b4ad0c'", sqlQuery); } [TestMethod] @@ -118,7 +154,7 @@ public void TranslateWhereWithEnumSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.WHERE_CLAUSE); - Assert.AreEqual("WHERE c.enumNumber = 'ONE' AND c.intField <= 5 ", sqlQuery); + Assert.AreEqual("WHERE c.enumNumber = 'ONE' AND c.intField <= 5", sqlQuery); } [TestMethod] @@ -129,7 +165,7 @@ public void TranslateWhereWithNextedFieldsSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.WHERE_CLAUSE); - Assert.AreEqual("WHERE c.parent.child = 'childValue' AND c.intField <= 5 ", sqlQuery); + Assert.AreEqual("WHERE c.parent.child = 'childValue' AND c.intField <= 5", sqlQuery); } [TestMethod] @@ -140,7 +176,7 @@ public void TranslateAdditionalWhereSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.WHERE_CLAUSE, "c.dataType = 'MockOpenType'"); - Assert.AreEqual("WHERE c.dataType = 'MockOpenType' AND c.englishName = 'Microsoft' AND c.intField <= 5 ", sqlQuery); + Assert.AreEqual("WHERE c.dataType = 'MockOpenType' AND c.englishName = 'Microsoft' AND c.intField <= 5", sqlQuery); } [TestMethod] @@ -151,7 +187,7 @@ public void TranslateSelectWhereSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.SELECT_CLAUSE | TranslateOptions.WHERE_CLAUSE, "c.dataType = 'MockOpenType'"); - Assert.AreEqual("SELECT * FROM c WHERE c.dataType = 'MockOpenType' AND c.englishName = 'Microsoft' ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE c.dataType = 'MockOpenType' AND c.englishName = 'Microsoft'", sqlQuery); } [TestMethod] @@ -184,7 +220,7 @@ public void TranslateContainsSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE CONTAINS(c.englishName,'Microsoft') ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE CONTAINS(c.englishName,'Microsoft')", sqlQuery); } [TestMethod] @@ -195,7 +231,7 @@ public void TranslateStartswithSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE STARTSWITH(c.englishName,'Microsoft') ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE STARTSWITH(c.englishName,'Microsoft')", sqlQuery); } [TestMethod] @@ -206,7 +242,7 @@ public void TranslateEndswithSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE ENDSWITH(c.englishName,'Microsoft') ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE ENDSWITH(c.englishName,'Microsoft')", sqlQuery); } [TestMethod] @@ -217,7 +253,7 @@ public void TranslateUpperAndLowerSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE UPPER(c.englishName) = 'MICROSOFT' OR LOWER(c.englishName) = 'microsoft' ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE UPPER(c.englishName) = 'MICROSOFT' OR LOWER(c.englishName) = 'microsoft'", sqlQuery); } [TestMethod] @@ -228,7 +264,7 @@ public void TranslateLengthSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE LENGTH(c.englishName) >= 10 AND LENGTH(c.englishName) < 15 ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE LENGTH(c.englishName) >= 10 AND LENGTH(c.englishName) < 15", sqlQuery); } [TestMethod] @@ -239,7 +275,7 @@ public void TranslateIndexOfSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE INDEX_OF(c.englishName,'soft') = 4 ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE INDEX_OF(c.englishName,'soft') = 4", sqlQuery); } [TestMethod] @@ -250,7 +286,7 @@ public void TranslateSubstringSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE SUBSTRING(c.englishName,1,LENGTH(c.englishName)) = 'icrosoft' ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE SUBSTRING(c.englishName,1,LENGTH(c.englishName)) = 'icrosoft'", sqlQuery); } [TestMethod] @@ -261,7 +297,7 @@ public void TranslateTrimSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE LTRIM(RTRIM(c.englishName)) = 'Microsoft' ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE LTRIM(RTRIM(c.englishName)) = 'Microsoft'", sqlQuery); } [TestMethod] @@ -272,7 +308,7 @@ public void TranslateConcatSample() var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); - Assert.AreEqual("SELECT * FROM c WHERE CONCAT(c.englishName,' Canada') = 'Microsoft Canada' ", sqlQuery); + Assert.AreEqual("SELECT * FROM c WHERE CONCAT(c.englishName,' Canada') = 'Microsoft Canada'", sqlQuery); } [TestMethod] @@ -285,5 +321,38 @@ public void TranslateMasterSample() var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL, "c._t = 'dataType'"); Assert.AreEqual("SELECT TOP 30 c.id, c.englishName FROM c WHERE c._t = 'dataType' AND c.title = 'title1' AND c.property.field != 'val' OR c.viewedCount >= 5 AND (c.likedCount != 3 OR c.enumNumber = 'TWO') ORDER BY c._lastClientEditedDateTime ASC, c.createdDateTime DESC ", sqlQuery); } + + [TestMethod] + public void TranslateCountSample() + { + httpRequestMessage.RequestUri = new Uri("http://localhost/User?$count=true&$filter=englishName eq 'Microsoft'"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.SELECT_CLAUSE | TranslateOptions.WHERE_CLAUSE); + Assert.AreEqual("SELECT VALUE COUNT(1) FROM c WHERE c.englishName = 'Microsoft'", sqlQuery); + } + + [TestMethod] + public void TranslateGeoDistanceSample() + { + httpRequestMessage.RequestUri = new Uri("http://localhost/User?$filter=geo.distance(location, geography'POINT(31.9 -4.8)') lt 100"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); + Assert.AreEqual("SELECT * FROM c WHERE ST_DISTANCE(c.location,{\"type\":\"Point\",\"coordinates\":[31.9,-4.8]}) < 100", sqlQuery); + } + + [TestMethod] + public void TranslateGeoIntersectsSample() + { + httpRequestMessage.RequestUri = new Uri("http://localhost/User?$filter=geo.intersects(area, geography'POLYGON((31.8 -5, 32 -5, 32 -4.7, 31.8 -4.7, 31.8 -5))')"); + var oDataQueryOptions = new ODataQueryOptions(oDataQueryContext, httpRequestMessage); + + var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter()); + var sqlQuery = oDataToSqlTranslator.Translate(oDataQueryOptions, TranslateOptions.ALL & ~TranslateOptions.TOP_CLAUSE); + Assert.AreEqual("SELECT * FROM c WHERE ST_INTERSECTS(c.area,{\"type\":\"Polygon\",\"coordinates\":[[[31.8,-5.0],[32.0,-5.0],[32.0,-4.7],[31.8,-4.7],[31.8,-5.0]]]})", sqlQuery); + } } } diff --git a/azure-documentdb-odata-sql-samples/app.config b/azure-documentdb-odata-sql-samples/app.config new file mode 100644 index 0000000..ceee8d6 --- /dev/null +++ b/azure-documentdb-odata-sql-samples/app.config @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/azure-documentdb-odata-sql-samples/azure-documentdb-odata-sql-samples.csproj b/azure-documentdb-odata-sql-samples/azure-documentdb-odata-sql-samples.csproj index 9401caf..99c7cc8 100644 --- a/azure-documentdb-odata-sql-samples/azure-documentdb-odata-sql-samples.csproj +++ b/azure-documentdb-odata-sql-samples/azure-documentdb-odata-sql-samples.csproj @@ -8,7 +8,7 @@ Properties azure_documentdb_odata_sql_tests azure-documentdb-odata-sql-tests - v4.5.2 + v4.6.2 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 @@ -18,6 +18,7 @@ UnitTest + true @@ -37,53 +38,133 @@ 4 - - ..\packages\Microsoft.Azure.DocumentDB.1.10.0\lib\net45\Microsoft.Azure.Documents.Client.dll + + ..\packages\Microsoft.Azure.DocumentDB.1.17.0\lib\net45\Microsoft.Azure.Documents.Client.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.1.1.1\lib\netstandard1.1\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.OData.Core.7.3.1\lib\portable-net45+win8+wpa81\Microsoft.OData.Core.dll + + + ..\packages\Microsoft.OData.Edm.7.3.1\lib\portable-net45+win8+wpa81\Microsoft.OData.Edm.dll + + + ..\packages\Microsoft.Spatial.7.3.1\lib\portable-net45+win8+wpa81\Microsoft.Spatial.dll + + + ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + True + + + ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + + + + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll True - - ..\packages\Microsoft.Data.Edm.5.6.0\lib\net40\Microsoft.Data.Edm.dll + + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll True - - ..\packages\Microsoft.Data.OData.5.6.0\lib\net40\Microsoft.Data.OData.dll + + ..\packages\System.Diagnostics.DiagnosticSource.4.4.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll True - - ..\packages\Microsoft.OData.Core.6.15.0\lib\portable-net45+win+wpa81\Microsoft.OData.Core.dll + + ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll True - - ..\packages\Microsoft.OData.Edm.6.15.0\lib\portable-net45+win+wpa81\Microsoft.OData.Edm.dll + + ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll True - - ..\packages\Microsoft.Spatial.6.15.0\lib\portable-net45+win+wpa81\Microsoft.Spatial.dll + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll True - - ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + + + ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll True - - - - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.2\lib\net45\System.Net.Http.Formatting.dll + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + True + + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\packages\System.Net.Http.4.3.2\lib\net46\System.Net.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + True + + + ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll + True + + + + ..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll + True + + + ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll + True + + + ..\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll + True + + + ..\packages\System.Runtime.InteropServices.4.3.0\lib\net462\System.Runtime.InteropServices.dll + True + + + ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll True - - ..\packages\System.Spatial.5.6.0\lib\net40\System.Spatial.dll + + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll True - - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.2\lib\net45\System.Web.Http.dll + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True - - ..\packages\Microsoft.AspNet.OData.5.9.1\lib\net45\System.Web.OData.dll + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll True + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + True + + + ..\packages\Microsoft.AspNet.OData.6.1.0\lib\net45\System.Web.OData.dll + + + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll + @@ -109,6 +190,7 @@ + @@ -131,12 +213,12 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - +