|
From: <ric...@us...> - 2009-11-23 17:38:18
|
Revision: 4855
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4855&view=rev
Author: ricbrown
Date: 2009-11-23 17:38:07 +0000 (Mon, 23 Nov 2009)
Log Message:
-----------
Added first cut of projections using Lambda expressions.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs
trunk/nhibernate/src/NHibernate/Criterion/Projections.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2009-11-22 15:34:59 UTC (rev 4854)
+++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2009-11-23 17:38:07 UTC (rev 4855)
@@ -1,7 +1,9 @@
using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using NHibernate.Impl;
using NHibernate.SqlCommand;
using NHibernate.Type;
-using System.Collections.Generic;
namespace NHibernate.Criterion
{
@@ -32,6 +34,11 @@
return Add(Projections.Alias(projection, alias));
}
+ public ProjectionList Add<T>(IProjection projection, Expression<Func<T>> alias)
+ {
+ return Add(projection, ExpressionProcessor.FindMemberExpression(alias.Body));
+ }
+
public IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
IList<IType> types = new List<IType>(Length);
Modified: trunk/nhibernate/src/NHibernate/Criterion/Projections.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2009-11-22 15:34:59 UTC (rev 4854)
+++ trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2009-11-23 17:38:07 UTC (rev 4855)
@@ -1,4 +1,6 @@
using System;
+using System.Linq.Expressions;
+using NHibernate.Impl;
using NHibernate.Type;
namespace NHibernate.Criterion
@@ -316,5 +318,138 @@
SelectSubqueryExpression expr = new SelectSubqueryExpression(detachedCriteria);
return new SubqueryProjection(expr);
}
+
+ /// <summary>
+ /// A property average value
+ /// </summary>
+ public static AggregateProjection Avg<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property average value
+ /// </summary>
+ public static AggregateProjection Avg(Expression<Func<object>> expression)
+ {
+ return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property value count
+ /// </summary>
+ public static CountProjection Count<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property value count
+ /// </summary>
+ public static CountProjection Count(Expression<Func<object>> expression)
+ {
+ return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A distinct property value count
+ /// </summary>
+ public static CountProjection CountDistinct<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.CountDistinct(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A distinct property value count
+ /// </summary>
+ public static CountProjection CountDistinct(Expression<Func<object>> expression)
+ {
+ return Projections.CountDistinct(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A grouping property value
+ /// </summary>
+ public static PropertyProjection GroupProperty<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.GroupProperty(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A grouping property value
+ /// </summary>
+ public static PropertyProjection GroupProperty(Expression<Func<object>> expression)
+ {
+ return Projections.GroupProperty(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property maximum value
+ /// </summary>
+ public static AggregateProjection Max<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property maximum value
+ /// </summary>
+ public static AggregateProjection Max(Expression<Func<object>> expression)
+ {
+ return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property minimum value
+ /// </summary>
+ public static AggregateProjection Min<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property minimum value
+ /// </summary>
+ public static AggregateProjection Min(Expression<Func<object>> expression)
+ {
+ return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A projected property value
+ /// </summary>
+ public static PropertyProjection Property<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Property(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A projected property value
+ /// </summary>
+ public static PropertyProjection Property(Expression<Func<object>> expression)
+ {
+ return Projections.Property(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ public static IProjection SubQuery<T>(QueryOver<T> detachedQueryOver)
+ {
+ return Projections.SubQuery(detachedQueryOver.DetachedCriteria);
+ }
+
+ /// <summary>
+ /// A property value sum
+ /// </summary>
+ public static AggregateProjection Sum<T>(Expression<Func<T, object>> expression)
+ {
+ return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
+
+ /// <summary>
+ /// A property value sum
+ /// </summary>
+ public static AggregateProjection Sum(Expression<Func<object>> expression)
+ {
+ return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body));
+ }
}
}
Added: trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionsExtensions.cs 2009-11-23 17:38:07 UTC (rev 4855)
@@ -0,0 +1,23 @@
+using System;
+using System.Linq.Expressions;
+
+using NHibernate.Impl;
+
+namespace NHibernate.Criterion
+{
+ public static class ProjectionsExtensions
+ {
+ /// <summary>
+ /// Create an alias for a projection
+ /// </summary>
+ /// <param name="projection">the projection instance</param>
+ /// <param name="alias">LambdaExpression returning an alias</param>
+ /// <returns>return NHibernate.Criterion.IProjection</returns>
+ public static IProjection WithAlias(this IProjection projection,
+ Expression<Func<object>> alias)
+ {
+ string aliasContainer = ExpressionProcessor.FindMemberExpression(alias.Body);
+ return Projections.Alias(projection, aliasContainer);
+ }
+ }
+}
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-22 15:34:59 UTC (rev 4854)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-23 17:38:07 UTC (rev 4855)
@@ -515,6 +515,7 @@
<Compile Include="Criterion\Lambda\QueryOverRestrictionBuilder.cs" />
<Compile Include="Criterion\Lambda\QueryOverSubqueryBuilder.cs" />
<Compile Include="Criterion\Lambda\QueryOverSubqueryPropertyBuilder.cs" />
+ <Compile Include="Criterion\ProjectionsExtensions.cs" />
<Compile Include="Dialect\MsSql2008Dialect.cs" />
<Compile Include="Dialect\InformixDialect0940.cs" />
<Compile Include="Dialect\InformixDialect1000.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2009-11-23 17:38:07 UTC (rev 4855)
@@ -0,0 +1,90 @@
+using System;
+using System.Collections;
+
+using NUnit.Framework;
+
+using NHibernate.Criterion;
+
+namespace NHibernate.Test.Criteria.Lambda
+{
+
+ [TestFixture]
+ public class ProjectionsFixture : LambdaFixtureBase
+ {
+
+ private Child _subqueryChildAlias = null;
+
+ private DetachedCriteria DetachedCriteriaAge
+ {
+ get
+ {
+ return ToDetachedCriteria(DetachedQueryOverAge);
+ }
+ }
+
+ private QueryOver<Child> DetachedQueryOverAge
+ {
+ get
+ {
+ return
+ new QueryOver<Child>(() => _subqueryChildAlias)
+ .Where(() => _subqueryChildAlias.Nickname == "subquery name")
+ .Select(p => p.Age);
+ }
+ }
+
+ [Test]
+ public void ArbitraryProjections()
+ {
+ ICriteria expected =
+ CreateTestCriteria(typeof(Person), "personAlias")
+ .SetProjection(Projections.ProjectionList()
+ .Add(Projections.Alias(Projections.Avg("Age"), "personAgeProjectionAlias"))
+ .Add(Projections.Avg("Age"), "personAgeProjectionAlias")
+ .Add(Projections.Avg("personAlias.Age"))
+ .Add(Projections.Count("Age"))
+ .Add(Projections.Count("personAlias.Age"))
+ .Add(Projections.CountDistinct("Age"))
+ .Add(Projections.CountDistinct("personAlias.Age"))
+ .Add(Projections.GroupProperty("Age"))
+ .Add(Projections.GroupProperty("personAlias.Age"))
+ .Add(Projections.Max("Age"))
+ .Add(Projections.Max("personAlias.Age"))
+ .Add(Projections.Min("Age"))
+ .Add(Projections.Min("personAlias.Age"))
+ .Add(Projections.Property("Age"))
+ .Add(Projections.Property("personAlias.Age"))
+ .Add(Projections.SubQuery(DetachedCriteriaAge))
+ .Add(Projections.Sum("Age"))
+ .Add(Projections.Sum("personAlias.Age")));
+
+ Person personAlias = null;
+ Person personAgeProjectionAlias = null;
+ var actual =
+ CreateTestQueryOver<Person>(() => personAlias)
+ .Select(Projections.ProjectionList()
+ .Add(Projections.Avg<Person>(p => p.Age).WithAlias(() => personAgeProjectionAlias))
+ .Add(Projections.Avg<Person>(p => p.Age), () => personAgeProjectionAlias)
+ .Add(Projections.Avg(() => personAlias.Age))
+ .Add(Projections.Count<Person>(p => p.Age))
+ .Add(Projections.Count(() => personAlias.Age))
+ .Add(Projections.CountDistinct<Person>(p => p.Age))
+ .Add(Projections.CountDistinct(() => personAlias.Age))
+ .Add(Projections.GroupProperty<Person>(p => p.Age))
+ .Add(Projections.GroupProperty(() => personAlias.Age))
+ .Add(Projections.Max<Person>(p => p.Age))
+ .Add(Projections.Max(() => personAlias.Age))
+ .Add(Projections.Min<Person>(p => p.Age))
+ .Add(Projections.Min(() => personAlias.Age))
+ .Add(Projections.Property<Person>(p => p.Age))
+ .Add(Projections.Property(() => personAlias.Age))
+ .Add(Projections.SubQuery(DetachedQueryOverAge))
+ .Add(Projections.Sum<Person>(p => p.Age))
+ .Add(Projections.Sum(() => personAlias.Age)));
+
+ AssertCriteriaAreEqual(expected, actual);
+ }
+
+ }
+
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-22 15:34:59 UTC (rev 4854)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-23 17:38:07 UTC (rev 4855)
@@ -160,6 +160,7 @@
<Compile Include="Criteria\Enrolment.cs" />
<Compile Include="Criteria\Lambda\CriteriaAssertFixture.cs" />
<Compile Include="Criteria\Lambda\ExpressionProcessorFixture.cs" />
+ <Compile Include="Criteria\Lambda\ProjectionsFixture.cs" />
<Compile Include="Criteria\Lambda\QueryOverFixture.cs" />
<Compile Include="Criteria\Lambda\IntegrationFixture.cs" />
<Compile Include="Criteria\Lambda\LambdaFixtureBase.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|