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