From e06cda98e93522fe349f52bd2c459cbaf4e3109e Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Feb 2017 22:25:07 +1100 Subject: [PATCH] fixes SQL IN expression --- .../Querying/ExpressionVisitorBase.cs | 5 +++-- .../Persistence/Querying/ExpressionTests.cs | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Querying/ExpressionVisitorBase.cs b/src/Umbraco.Core/Persistence/Querying/ExpressionVisitorBase.cs index 50126c7fcc..9ebb3d17b0 100644 --- a/src/Umbraco.Core/Persistence/Querying/ExpressionVisitorBase.cs +++ b/src/Umbraco.Core/Persistence/Querying/ExpressionVisitorBase.cs @@ -540,8 +540,9 @@ namespace Umbraco.Core.Persistence.Querying //special case, if it is 'Contains' and the argumet that Contains is being called on is //Enumerable and the methodArgs is the actual member access, then it's an SQL IN claus - if (m.Arguments.Count == 2 - && m.Object == null + if (m.Object == null + && m.Arguments[0].Type != typeof(string) + && m.Arguments.Count == 2 && methodArgs.Length == 1 && methodArgs[0].NodeType == ExpressionType.MemberAccess && TypeHelper.IsTypeAssignableFrom(m.Arguments[0].Type)) diff --git a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs index 65a660146e..51de34efc2 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ExpressionTests.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Linq; using System.Linq.Expressions; using Moq; using NUnit.Framework; @@ -156,5 +157,21 @@ namespace Umbraco.Tests.Persistence.Querying Assert.AreEqual("@test", modelToSqlExpressionHelper.GetSqlParameters()[2]); } + [Test] + public void Sql_In() + { + var userNames = new[] {"hello@world.com", "blah@blah.com"}; + + Expression> predicate = user => userNames.Contains(user.Username); + var modelToSqlExpressionHelper = new ModelToSqlExpressionVisitor(); + var result = modelToSqlExpressionHelper.Visit(predicate); + + Debug.Print("Model to Sql ExpressionHelper: \n" + result); + + Assert.AreEqual("[umbracoUser].[userLogin] IN (@1,@2)", result); + Assert.AreEqual("hello@world.com", modelToSqlExpressionHelper.GetSqlParameters()[1]); + Assert.AreEqual("blah@blah.com", modelToSqlExpressionHelper.GetSqlParameters()[2]); + } + } }