|
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.
|