diff --git a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs index 04f4147155..f5c0e0e616 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs @@ -34,11 +34,27 @@ namespace Umbraco.Core.Persistence return sql.Where(whereExpression, expresionist.GetSqlParameters()); } + private static string GetFieldName(Expression> fieldSelector, ISqlSyntaxProvider sqlSyntax) + { + var field = ExpressionHelper.FindProperty(fieldSelector) as PropertyInfo; + var fieldName = field.GetColumnName(); + + var type = typeof(T); + var tableName = type.GetTableName(); + + return sqlSyntax.GetQuotedTableName(tableName) + "." + sqlSyntax.GetQuotedColumnName(fieldName); + } + + [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] public static Sql WhereIn(this Sql sql, Expression> fieldSelector, IEnumerable values) { - var expresionist = new PocoToSqlExpressionHelper(); - var fieldExpression = expresionist.Visit(fieldSelector); - return sql.Where(fieldExpression + " IN (@values)", new {@values = values}); + return sql.WhereIn(fieldSelector, values, SqlSyntaxContext.SqlSyntaxProvider); + } + + public static Sql WhereIn(this Sql sql, Expression> fieldSelector, IEnumerable values, ISqlSyntaxProvider sqlSyntax) + { + var fieldName = GetFieldName(fieldSelector, sqlSyntax); + return sql.Where(fieldName + " IN (@values)", new { values }); } [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] @@ -49,17 +65,7 @@ namespace Umbraco.Core.Persistence public static Sql OrderBy(this Sql sql, Expression> columnMember, ISqlSyntaxProvider sqlSyntax) { - var column = ExpressionHelper.FindProperty(columnMember) as PropertyInfo; - var columnName = column.GetColumnName(); - - var type = typeof(TColumn); - var tableName = type.GetTableName(); - - //need to ensure the order by is in brackets, see: https://github.com/toptensoftware/PetaPoco/issues/177 - var syntax = string.Format("({0}.{1})", - sqlSyntax.GetQuotedTableName(tableName), - sqlSyntax.GetQuotedColumnName(columnName)); - + var syntax = "(" + GetFieldName(columnMember, sqlSyntax) + ")"; return sql.OrderBy(syntax); } diff --git a/src/Umbraco.Tests/Persistence/PetaPocoExpresionsTests.cs b/src/Umbraco.Tests/Persistence/PetaPocoExpresionsTests.cs new file mode 100644 index 0000000000..e788a833bc --- /dev/null +++ b/src/Umbraco.Tests/Persistence/PetaPocoExpresionsTests.cs @@ -0,0 +1,36 @@ +using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Tests.Persistence +{ + [TestFixture] + public class PetaPocoExpresionsTests + { + [Test] + public void WhereInValueFieldTest() + { + var syntax = SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); + var sql = new Sql() + .Select("*") + .From(syntax) + .WhereIn(x => x.NodeId, new[] { 1, 2, 3 }, syntax); + Assert.AreEqual("SELECT *\nFROM [umbracoNode]\nWHERE ([umbracoNode].[id] IN (@0,@1,@2))", sql.SQL); + } + + [Test] + public void WhereInObjectFieldTest() + { + // this test used to fail because x => x.Text was evaluated as a lambda + // and returned "[umbracoNode].[text] = @0"... had to fix WhereIn. + + var syntax = SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); + var sql = new Sql() + .Select("*") + .From(syntax) + .WhereIn(x => x.Text, new[] { "a", "b", "c" }, syntax); + Assert.AreEqual("SELECT *\nFROM [umbracoNode]\nWHERE ([umbracoNode].[text] IN (@0,@1,@2))", sql.SQL); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a38e951434..9ccbe1ce6b 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -177,6 +177,7 @@ + diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index dd47cd5570..fb402fcc68 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -1,4 +1,4 @@ - + @@ -310,10 +310,7 @@ Configure it here if you need anything specific. Needs to be a complete url with scheme and umbraco path, eg http://mysite.com/umbraco. NOT just "mysite.com" or "mysite.com/umbraco" or "http://mysite.com". --> - + \ No newline at end of file