From de89f555d45c9f51cf2f275640753229b3941b0d Mon Sep 17 00:00:00 2001 From: Jeremy Pyne Date: Mon, 25 Jul 2016 16:46:49 -0400 Subject: [PATCH 1/4] Added missing Sql mapping for standard Replace function: .Where(s => s.Name.Replace(" ", "-") == userName) Should generate valid SQL: REPLACE([dbo].[MyModel].[Name], ' ', '-') --- .../Querying/BaseExpressionHelper.cs | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs index 4679b9b2ad..0960acc9e5 100644 --- a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs @@ -440,6 +440,55 @@ namespace Umbraco.Core.Persistence.Querying } return HandleStringComparison(visitedObjectForMethod, compareValue, m.Method.Name, colType); + + case "Replace": + string searchValue; + + if (methodArgs[0].NodeType != ExpressionType.Constant) + { + //This occurs when we are getting a value from a non constant such as: x => x.Path.StartsWith(content.Path) + // So we'll go get the value: + var member = Expression.Convert(methodArgs[0], typeof(object)); + var lambda = Expression.Lambda>(member); + var getter = lambda.Compile(); + searchValue = getter().ToString(); + } + else + { + searchValue = methodArgs[0].ToString(); + } + + if (methodArgs[0].Type != typeof(string) && TypeHelper.IsTypeAssignableFrom(methodArgs[0].Type)) + { + throw new NotSupportedException("An array Contains method is not supported"); + } + + string replaceValue; + + if (methodArgs[1].NodeType != ExpressionType.Constant) + { + //This occurs when we are getting a value from a non constant such as: x => x.Path.StartsWith(content.Path) + // So we'll go get the value: + var member = Expression.Convert(methodArgs[1], typeof(object)); + var lambda = Expression.Lambda>(member); + var getter = lambda.Compile(); + replaceValue = getter().ToString(); + } + else + { + replaceValue = methodArgs[1].ToString(); + } + + if (methodArgs[1].Type != typeof(string) && TypeHelper.IsTypeAssignableFrom(methodArgs[1].Type)) + { + throw new NotSupportedException("An array Contains method is not supported"); + } + + SqlParameters.Add(RemoveQuote(searchValue)); + + SqlParameters.Add(RemoveQuote(replaceValue)); + + return string.Format("replace({0}, @{1}, @{2})", visitedObjectForMethod, SqlParameters.Count - 2, SqlParameters.Count - 1); //case "Substring": // var startIndex = Int32.Parse(args[0].ToString()) + 1; // if (args.Count == 2) @@ -501,7 +550,7 @@ namespace Umbraco.Core.Persistence.Querying //case "As": // return string.Format("{0} As {1}", r, // GetQuotedColumnName(RemoveQuoteFromAlias(RemoveQuote(args[0].ToString())))); - + default: throw new ArgumentOutOfRangeException("No logic supported for " + m.Method.Name); From c6a2d41888d5cc790e4622dfca68d99c9a2dd640 Mon Sep 17 00:00:00 2001 From: Jeremy Pyne Date: Tue, 26 Jul 2016 09:45:45 -0400 Subject: [PATCH 2/4] Added test. --- .../Persistence/Querying/ExpressionTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs index ab94d4d6d5..5148a6f17f 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs @@ -117,5 +117,19 @@ namespace Umbraco.Tests.Persistence.Querying Assert.AreEqual("mydomain\\myuser%", modelToSqlExpressionHelper.GetSqlParameters()[0]); } + [Test] + public void Sql_Replace_Mapped() + { + Expression> predicate = user => user.Username.Replace("@world", "@test") == "hello@test.com"; + var modelToSqlExpressionHelper = new ModelToSqlExpressionHelper(); + var result = modelToSqlExpressionHelper.Visit(predicate); + + Console.WriteLine("Model to Sql ExpressionHelper: \n" + result); + + Assert.AreEqual("replace([umbracoUser].[userLogin], @0, @1", result); + Assert.AreEqual("@world", modelToSqlExpressionHelper.GetSqlParameters()[0]); + Assert.AreEqual("@test", modelToSqlExpressionHelper.GetSqlParameters()[0]); + } + } } \ No newline at end of file From 2cad3838f47fc999601e4f255cda1f5dad1476f2 Mon Sep 17 00:00:00 2001 From: Jeremy Pyne Date: Tue, 26 Jul 2016 10:27:19 -0400 Subject: [PATCH 3/4] Update ExpressionTests.cs Fixes for SQL replace test. --- .../Persistence/Querying/ExpressionTests.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs index 5148a6f17f..2d779d0eaf 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs @@ -126,10 +126,11 @@ namespace Umbraco.Tests.Persistence.Querying Console.WriteLine("Model to Sql ExpressionHelper: \n" + result); - Assert.AreEqual("replace([umbracoUser].[userLogin], @0, @1", result); - Assert.AreEqual("@world", modelToSqlExpressionHelper.GetSqlParameters()[0]); - Assert.AreEqual("@test", modelToSqlExpressionHelper.GetSqlParameters()[0]); + Assert.AreEqual("(replace([umbracoUser].[userLogin], @1, @2) = @0)", result); + Assert.AreEqual("hello@test.com", modelToSqlExpressionHelper.GetSqlParameters()[0]); + Assert.AreEqual("@world", modelToSqlExpressionHelper.GetSqlParameters()[1]); + Assert.AreEqual("@test", modelToSqlExpressionHelper.GetSqlParameters()[2]); } } -} \ No newline at end of file +} From cbf67a4399e97474352320a9e0d37dec85926d5b Mon Sep 17 00:00:00 2001 From: Claus Date: Mon, 8 Aug 2016 10:18:44 +0200 Subject: [PATCH 4/4] changing to Debug.Print. --- src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs index 2d779d0eaf..4529343811 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs @@ -124,7 +124,7 @@ namespace Umbraco.Tests.Persistence.Querying var modelToSqlExpressionHelper = new ModelToSqlExpressionHelper(); var result = modelToSqlExpressionHelper.Visit(predicate); - Console.WriteLine("Model to Sql ExpressionHelper: \n" + result); + Debug.Print("Model to Sql ExpressionHelper: \n" + result); Assert.AreEqual("(replace([umbracoUser].[userLogin], @1, @2) = @0)", result); Assert.AreEqual("hello@test.com", modelToSqlExpressionHelper.GetSqlParameters()[0]);