diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
index 7ae81aaa16..cf3fd1511f 100644
--- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
+++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
@@ -21,14 +21,18 @@ namespace Umbraco.Core.Persistence
///
/// This will escape single @ symbols for peta poco values so it doesn't think it's a parameter
///
- ///
///
///
- public static string EscapeAtSymbols(this Database db, string value)
+ public static string EscapeAtSymbols(string value)
{
- //this fancy regex will only match a single @ not a double, etc...
- var regex = new Regex("(?(this Database db)
diff --git a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs
index ac84b5cee3..73fa98b275 100644
--- a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs
+++ b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs
@@ -64,13 +64,7 @@ namespace Umbraco.Core.Persistence.Querying
public virtual string EscapeAtArgument(string exp)
{
- /*if (exp.StartsWith("@"))
- return string.Concat("@", exp);*/
-
- if (exp.Contains("@"))
- return exp.Replace("@", "@@");
-
- return exp;
+ return PetaPocoExtensions.EscapeAtSymbols(exp);
}
public virtual bool ShouldQuoteValue(Type fieldType)
diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs
index 738cc8a23c..611d9c63a3 100644
--- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs
+++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs
@@ -2,9 +2,11 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
+using System.Linq;
using System.Linq.Expressions;
using System.Text;
using Umbraco.Core.Persistence.Mappers;
+using Umbraco.Core.Persistence.SqlSyntax;
namespace Umbraco.Core.Persistence.Querying
{
@@ -226,6 +228,39 @@ namespace Umbraco.Core.Persistence.Querying
}
+ private string HandleStringComparison(string col, string val, string verb, TextColumnType columnType)
+ {
+ switch (verb)
+ {
+ case "Equals":
+ return SqlSyntaxContext.SqlSyntaxProvider.GetStringColumnEqualComparison(col, EscapeAtArgument(RemoveQuote(val)), columnType);
+ case "StartsWith":
+ return SqlSyntaxContext.SqlSyntaxProvider.GetStringColumnStartsWithComparison(col, EscapeAtArgument(RemoveQuote(val)), columnType);
+ case "EndsWith":
+ return SqlSyntaxContext.SqlSyntaxProvider.GetStringColumnEndsWithComparison(col, EscapeAtArgument(RemoveQuote(val)), columnType);
+ case "Contains":
+ return SqlSyntaxContext.SqlSyntaxProvider.GetStringColumnContainsComparison(col, EscapeAtArgument(RemoveQuote(val)), columnType);
+ case "InvariantEquals":
+ case "SqlEquals":
+ //recurse
+ return HandleStringComparison(col, val, "Equals", columnType);
+ case "InvariantStartsWith":
+ case "SqlStartsWith":
+ //recurse
+ return HandleStringComparison(col, val, "StartsWith", columnType);
+ case "InvariantEndsWith":
+ case "SqlEndsWith":
+ //recurse
+ return HandleStringComparison(col, val, "EndsWith", columnType);
+ case "InvariantContains":
+ case "SqlContains":
+ //recurse
+ return HandleStringComparison(col, val, "Contains", columnType);
+ default:
+ throw new ArgumentOutOfRangeException("verb");
+ }
+ }
+
protected virtual string VisitMethodCall(MethodCallExpression m)
{
List