From: <ric...@us...> - 2011-03-03 22:37:31
|
Revision: 5415 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5415&view=rev Author: ricbrown Date: 2011-03-03 22:37:25 +0000 (Thu, 03 Mar 2011) Log Message: ----------- Fix NH-2400 (Linq query fail when using contains from an empty Collection) - updated fix to handle IEnumerable (thanks to Patrick for spotting it) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessContains.cs trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2011-03-02 22:20:24 UTC (rev 5414) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2011-03-03 22:37:25 UTC (rev 5415) @@ -82,7 +82,7 @@ // Nulls generate different query plans. X = variable generates a different query depending on if variable is null or not. if (param.Value == null) _string.Append("NULL"); - if (param.Value is ICollection && ((ICollection)param.Value).Count == 0) + if (param.Value is IEnumerable && !((IEnumerable)param.Value).Cast<object>().Any()) _string.Append("EmptyList"); else _string.Append(param.Name); Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessContains.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessContains.cs 2011-03-02 22:20:24 UTC (rev 5414) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessContains.cs 2011-03-03 22:37:25 UTC (rev 5415) @@ -53,7 +53,7 @@ { var parameterName = source.NodesPreOrder.Single(n => n is HqlIdent).AstNode.Text; var parameterValue = parameters.ConstantToParameterMap.Single(p => p.Value.Name == parameterName).Key.Value; - return ((ICollection)parameterValue).Count == 0; + return !((IEnumerable)parameterValue).Cast<object>().Any(); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2011-03-02 22:20:24 UTC (rev 5414) +++ trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2011-03-03 22:37:25 UTC (rev 5415) @@ -339,6 +339,32 @@ } [Test] + public void UsersWithEmptyEnumerable() + { + var allNames = new List<string> { "ayende", "rahien" }; + var names = allNames.Where(n => n == "does not exist"); + + var query = (from user in db.Users + where names.Contains(user.Name) + select user).ToList(); + + Assert.That(query.Count, Is.EqualTo(0)); + } + + [Test] + [Ignore("inline empty list expression does not evaluate correctly")] + public void UsersWithEmptyInlineEnumerable() + { + var allNames = new List<string> { "ayende", "rahien" }; + + var query = (from user in db.Users + where allNames.Where(n => n == "does not exist").Contains(user.Name) + select user).ToList(); + + Assert.That(query.Count, Is.EqualTo(0)); + } + + [Test] public void WhenTheSourceOfConstantIsICollectionThenNoThrows() { ICollection<string> names = new List<string> {"ayende", "rahien"}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |