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