|
From: <ric...@us...> - 2009-11-18 13:13:32
|
Revision: 4833
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4833&view=rev
Author: ricbrown
Date: 2009-11-18 12:29:32 +0000 (Wed, 18 Nov 2009)
Log Message:
-----------
Added extra support for nullable bool and enum to QueryOver.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs
Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-11-15 15:39:52 UTC (rev 4832)
+++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-11-18 12:29:32 UTC (rev 4833)
@@ -124,6 +124,13 @@
if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess
|| memberExpression.Expression.NodeType == ExpressionType.Call)
{
+ if (IsNullableOfT(memberExpression.Member.DeclaringType))
+ {
+ // it's a Nullable<T>, so ignore any .Value
+ if (memberExpression.Member.Name == "Value")
+ return FindMemberExpression(memberExpression.Expression);
+ }
+
return FindMemberExpression(memberExpression.Expression) + "." + memberExpression.Member.Name;
}
else
@@ -258,6 +265,9 @@
if (type.IsAssignableFrom(value.GetType()))
return value;
+ if (IsNullableOfT(type))
+ type = Nullable.GetUnderlyingType(type);
+
if (type.IsEnum)
return Enum.ToObject(type, value);
@@ -267,6 +277,12 @@
throw new Exception("Cannot convert '" + value.ToString() + "' to " + type.ToString());
}
+ private static bool IsNullableOfT(System.Type type)
+ {
+ return type.IsGenericType
+ && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
+ }
+
private static ICriterion ProcessSimpleExpression(BinaryExpression be)
{
string property = FindMemberExpression(be.Left);
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs 2009-11-15 15:39:52 UTC (rev 4832)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs 2009-11-18 12:29:32 UTC (rev 4833)
@@ -116,6 +116,38 @@
}
}
+ [Test]
+ public void TestEvaluateNullableIntExpression()
+ {
+ ICriterion before = Restrictions.Eq("NullableAge", 5);
+ ICriterion after = ExpressionProcessor.ProcessExpression<Person>(p => p.NullableAge == 5);
+ Assert.AreEqual(before.ToString(), after.ToString());
+ }
+
+ [Test]
+ public void TestEvaluateNullableEnumExpression()
+ {
+ ICriterion before = Restrictions.Eq("NullableGender", PersonGender.Female);
+ ICriterion after = ExpressionProcessor.ProcessExpression<Person>(p => p.NullableGender == PersonGender.Female);
+ Assert.AreEqual(before.ToString(), after.ToString());
+ }
+
+ [Test]
+ public void TestEvaluateNullableEnumValueExpression()
+ {
+ ICriterion before = Restrictions.Eq("NullableGender", PersonGender.Female);
+ ICriterion after = ExpressionProcessor.ProcessExpression<Person>(p => p.NullableGender.Value == PersonGender.Female);
+ Assert.AreEqual(before.ToString(), after.ToString());
+ }
+
+ [Test]
+ public void TestEvaluateNullableBoolExpression()
+ {
+ ICriterion before = Restrictions.Eq("NullableIsParent", true);
+ ICriterion after = ExpressionProcessor.ProcessExpression<Person>(p => p.NullableIsParent.Value);
+ Assert.AreEqual(before.ToString(), after.ToString());
+ }
+
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2009-11-15 15:39:52 UTC (rev 4832)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2009-11-18 12:29:32 UTC (rev 4833)
@@ -25,6 +25,10 @@
public virtual bool IsParent { get; set; }
public virtual char Blood { get; set; }
+ public virtual int? NullableAge { get; set; }
+ public virtual PersonGender? NullableGender { get; set; }
+ public virtual bool? NullableIsParent { get; set; }
+
public virtual IEnumerable<Child> Children { get; set; }
public virtual IList<Person> PersonList { get; set; }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|