Skip to content

Commit c55bed9

Browse files
committed
Merge pull request #428 from hazzik/NH-3312
NH-3312 - Add ability to use static field and property as alias in QueryOver
2 parents f5b97a8 + 3c20462 commit c55bed9

File tree

2 files changed

+138
-14
lines changed

2 files changed

+138
-14
lines changed

src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,126 @@ public void SimpleCriterion_AliasReferenceSyntax()
248248
AssertCriteriaAreEqual(expected, actual);
249249
}
250250

251+
public Person personAliasField = null;
252+
253+
[Test]
254+
public void SimpleCriterion_AliasReferenceSyntaxField()
255+
{
256+
ICriteria expected =
257+
CreateTestCriteria(typeof(Person), "personAliasField")
258+
.Add(Restrictions.Eq("personAliasField.Name", "test name"))
259+
.Add(Restrictions.Not(Restrictions.Eq(("personAliasField.Name"), "not test name")))
260+
.Add(Restrictions.Gt("personAliasField.Age", 10))
261+
.Add(Restrictions.Ge("personAliasField.Age", 11))
262+
.Add(Restrictions.Lt("personAliasField.Age", 50))
263+
.Add(Restrictions.Le("personAliasField.Age", 49))
264+
.Add(Restrictions.Eq("personAliasField.class", typeof(Person)))
265+
.Add(Restrictions.Eq("personAliasField.class", typeof(Person).FullName));
266+
267+
IQueryOver<Person> actual =
268+
CreateTestQueryOver<Person>(() => personAliasField)
269+
.Where(() => personAliasField.Name == "test name")
270+
.And(() => personAliasField.Name != "not test name")
271+
.And(() => personAliasField.Age > 10)
272+
.And(() => personAliasField.Age >= 11)
273+
.And(() => personAliasField.Age < 50)
274+
.And(() => personAliasField.Age <= 49)
275+
.And(() => personAliasField.GetType() == typeof(Person))
276+
.And(() => personAliasField is Person);
277+
278+
AssertCriteriaAreEqual(expected, actual);
279+
}
280+
281+
public Person personAliasProperty { get; set; }
282+
283+
[Test]
284+
public void SimpleCriterion_AliasReferenceSyntaxProperty()
285+
{
286+
ICriteria expected =
287+
CreateTestCriteria(typeof(Person), "personAliasProperty")
288+
.Add(Restrictions.Eq("personAliasProperty.Name", "test name"))
289+
.Add(Restrictions.Not(Restrictions.Eq("personAliasProperty.Name", "not test name")))
290+
.Add(Restrictions.Gt("personAliasProperty.Age", 10))
291+
.Add(Restrictions.Ge("personAliasProperty.Age", 11))
292+
.Add(Restrictions.Lt("personAliasProperty.Age", 50))
293+
.Add(Restrictions.Le("personAliasProperty.Age", 49))
294+
.Add(Restrictions.Eq("personAliasProperty.class", typeof(Person)))
295+
.Add(Restrictions.Eq("personAliasProperty.class", typeof(Person).FullName));
296+
297+
IQueryOver<Person> actual =
298+
CreateTestQueryOver<Person>(() => personAliasProperty)
299+
.Where(() => personAliasProperty.Name == "test name")
300+
.And(() => personAliasProperty.Name != "not test name")
301+
.And(() => personAliasProperty.Age > 10)
302+
.And(() => personAliasProperty.Age >= 11)
303+
.And(() => personAliasProperty.Age < 50)
304+
.And(() => personAliasProperty.Age <= 49)
305+
.And(() => personAliasProperty.GetType() == typeof(Person))
306+
.And(() => personAliasProperty is Person);
307+
308+
AssertCriteriaAreEqual(expected, actual);
309+
}
310+
311+
public static Person personAliasStaticField = null;
312+
313+
[Test]
314+
public void SimpleCriterion_AliasReferenceSyntaxStaticField()
315+
{
316+
ICriteria expected =
317+
CreateTestCriteria(typeof(Person), "personAliasStaticField")
318+
.Add(Restrictions.Eq("personAliasStaticField.Name", "test name"))
319+
.Add(Restrictions.Not(Restrictions.Eq(("personAliasStaticField.Name"), "not test name")))
320+
.Add(Restrictions.Gt("personAliasStaticField.Age", 10))
321+
.Add(Restrictions.Ge("personAliasStaticField.Age", 11))
322+
.Add(Restrictions.Lt("personAliasStaticField.Age", 50))
323+
.Add(Restrictions.Le("personAliasStaticField.Age", 49))
324+
.Add(Restrictions.Eq("personAliasStaticField.class", typeof(Person)))
325+
.Add(Restrictions.Eq("personAliasStaticField.class", typeof(Person).FullName));
326+
327+
IQueryOver<Person> actual =
328+
CreateTestQueryOver<Person>(() => personAliasStaticField)
329+
.Where(() => personAliasStaticField.Name == "test name")
330+
.And(() => personAliasStaticField.Name != "not test name")
331+
.And(() => personAliasStaticField.Age > 10)
332+
.And(() => personAliasStaticField.Age >= 11)
333+
.And(() => personAliasStaticField.Age < 50)
334+
.And(() => personAliasStaticField.Age <= 49)
335+
.And(() => personAliasStaticField.GetType() == typeof(Person))
336+
.And(() => personAliasStaticField is Person);
337+
338+
AssertCriteriaAreEqual(expected, actual);
339+
}
340+
341+
public static Person personAliasStaticProperty { get; set; }
342+
343+
[Test]
344+
public void SimpleCriterion_AliasReferenceSyntaxStaticProperty()
345+
{
346+
ICriteria expected =
347+
CreateTestCriteria(typeof(Person), "personAliasStaticProperty")
348+
.Add(Restrictions.Eq("personAliasStaticProperty.Name", "test name"))
349+
.Add(Restrictions.Not(Restrictions.Eq("personAliasStaticProperty.Name", "not test name")))
350+
.Add(Restrictions.Gt("personAliasStaticProperty.Age", 10))
351+
.Add(Restrictions.Ge("personAliasStaticProperty.Age", 11))
352+
.Add(Restrictions.Lt("personAliasStaticProperty.Age", 50))
353+
.Add(Restrictions.Le("personAliasStaticProperty.Age", 49))
354+
.Add(Restrictions.Eq("personAliasStaticProperty.class", typeof(Person)))
355+
.Add(Restrictions.Eq("personAliasStaticProperty.class", typeof(Person).FullName));
356+
357+
IQueryOver<Person> actual =
358+
CreateTestQueryOver<Person>(() => personAliasStaticProperty)
359+
.Where(() => personAliasStaticProperty.Name == "test name")
360+
.And(() => personAliasStaticProperty.Name != "not test name")
361+
.And(() => personAliasStaticProperty.Age > 10)
362+
.And(() => personAliasStaticProperty.Age >= 11)
363+
.And(() => personAliasStaticProperty.Age < 50)
364+
.And(() => personAliasStaticProperty.Age <= 49)
365+
.And(() => personAliasStaticProperty.GetType() == typeof(Person))
366+
.And(() => personAliasStaticProperty is Person);
367+
368+
AssertCriteriaAreEqual(expected, actual);
369+
}
370+
251371
[Test]
252372
public void SubCriteria_JoinQueryOver_ToOne()
253373
{
@@ -932,4 +1052,4 @@ public void TransformQueryOverToRowCount64()
9321052

9331053
}
9341054

935-
}
1055+
}

src/NHibernate/Impl/ExpressionProcessor.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -301,23 +301,27 @@ public static string FindMemberExpression(Expression expression)
301301
var memberExpression = expression as MemberExpression;
302302
if (memberExpression != null)
303303
{
304-
if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess
305-
|| memberExpression.Expression.NodeType == ExpressionType.Call)
304+
var parentExpression = memberExpression.Expression;
305+
if (parentExpression != null)
306306
{
307-
if (memberExpression.Member.DeclaringType.IsNullable())
307+
if (parentExpression.NodeType == ExpressionType.MemberAccess
308+
|| parentExpression.NodeType == ExpressionType.Call)
308309
{
309-
// it's a Nullable<T>, so ignore any .Value
310-
if (memberExpression.Member.Name == "Value")
311-
return FindMemberExpression(memberExpression.Expression);
310+
if (memberExpression.Member.DeclaringType.IsNullable())
311+
{
312+
// it's a Nullable<T>, so ignore any .Value
313+
if (memberExpression.Member.Name == "Value")
314+
return FindMemberExpression(parentExpression);
315+
}
316+
317+
return FindMemberExpression(parentExpression) + "." + memberExpression.Member.Name;
318+
}
319+
if (IsConversion(parentExpression.NodeType))
320+
{
321+
return (FindMemberExpression(parentExpression) + "." + memberExpression.Member.Name).TrimStart('.');
312322
}
313-
314-
return FindMemberExpression(memberExpression.Expression) + "." + memberExpression.Member.Name;
315-
}
316-
if (IsConversion(memberExpression.Expression.NodeType))
317-
{
318-
return (FindMemberExpression(memberExpression.Expression) + "." + memberExpression.Member.Name).TrimStart('.');
319323
}
320-
324+
321325
return memberExpression.Member.Name;
322326
}
323327

0 commit comments

Comments
 (0)