From: <ric...@us...> - 2010-09-11 13:09:31
|
Revision: 5181 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5181&view=rev Author: ricbrown Date: 2010-09-11 13:09:24 +0000 (Sat, 11 Sep 2010) Log Message: ----------- QueryOver - added .Where(o => o is Person) syntax Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-09-04 23:33:02 UTC (rev 5180) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-09-11 13:09:24 UTC (rev 5181) @@ -175,12 +175,7 @@ MethodCallExpression methodCallExpression = (MethodCallExpression)expression; if (methodCallExpression.Method.Name == "GetType") - { - if (methodCallExpression.Object.NodeType == ExpressionType.MemberAccess) - return FindMemberExpression(methodCallExpression.Object) + ".class"; - else - return "class"; - } + return ClassMember(methodCallExpression.Object); if (methodCallExpression.Method.Name == "get_Item") return FindMemberExpression(methodCallExpression.Object); @@ -427,9 +422,23 @@ return ProcessCustomMethodCall(methodCallExpression); } - throw new Exception("Could not determine member type from " + expression.ToString()); + if (expression is TypeBinaryExpression) + { + TypeBinaryExpression typeBinaryExpression = (TypeBinaryExpression)expression; + return Restrictions.Eq(ClassMember(typeBinaryExpression.Expression), typeBinaryExpression.TypeOperand); + } + + throw new Exception("Could not determine member type from " + expression.NodeType + ", " + expression.ToString() + ", " + expression.GetType()); } + private static string ClassMember(Expression expression) + { + if (expression.NodeType == ExpressionType.MemberAccess) + return FindMemberExpression(expression) + ".class"; + else + return "class"; + } + private static string Signature(MethodInfo methodInfo) { return methodInfo.DeclaringType.FullName Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-09-04 23:33:02 UTC (rev 5180) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-09-11 13:09:24 UTC (rev 5181) @@ -27,6 +27,7 @@ .Add(Restrictions.Ge("Age", 11)) .Add(Restrictions.Lt("Age", 50)) .Add(Restrictions.Le("Age", 49)) + .Add(Restrictions.Eq("class", typeof(Person))) .Add(Restrictions.Eq("class", typeof(Person))); IQueryOver<Person> actual = @@ -37,7 +38,8 @@ .And(p => p.Age >= 11) .And(p => p.Age < 50) .And(p => p.Age <= 49) - .And(p => p.GetType() == typeof(Person)); + .And(p => p.GetType() == typeof(Person)) + .And(p => p is Person); AssertCriteriaAreEqual(expected, actual); } @@ -184,6 +186,7 @@ .Add(Restrictions.Ge("personAlias.Age", 11)) .Add(Restrictions.Lt("personAlias.Age", 50)) .Add(Restrictions.Le("personAlias.Age", 49)) + .Add(Restrictions.Eq("personAlias.class", typeof(Person))) .Add(Restrictions.Eq("personAlias.class", typeof(Person))); Person personAlias = null; @@ -195,7 +198,8 @@ .And(() => personAlias.Age >= 11) .And(() => personAlias.Age < 50) .And(() => personAlias.Age <= 49) - .And(() => personAlias.GetType() == typeof(Person)); + .And(() => personAlias.GetType() == typeof(Person)) + .And(() => personAlias is Person); AssertCriteriaAreEqual(expected, actual); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |