|
From: <dav...@us...> - 2009-04-18 14:16:03
|
Revision: 4189
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4189&view=rev
Author: davybrion
Date: 2009-04-18 14:15:48 +0000 (Sat, 18 Apr 2009)
Log Message:
-----------
applying (updated) patch from James Lanng for NH-1670
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/IMultiCriteria.cs
trunk/nhibernate/src/NHibernate/IMultiQuery.cs
trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs
trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs
trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs
trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs
trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs
trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs
trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs
trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs
Modified: trunk/nhibernate/src/NHibernate/IMultiCriteria.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -10,11 +10,49 @@
public interface IMultiCriteria
{
/// <summary>
- /// Get all the
+ /// Get all the results
/// </summary>
IList List();
/// <summary>
+ /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param>
+ /// <param name="criteria">The criteria.</param>
+ /// <returns></returns>
+ IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria);
+
+ /// <summary>
+ /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="criteria">The criteria.</param>
+ /// <returns></returns>
+ IMultiCriteria Add<T>(ICriteria criteria);
+
+ /// <summary>
+ /// Adds the specified criteria to the query, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="key">The key</param>
+ /// <param name="criteria">The criteria</param>
+ /// <returns></returns>
+ IMultiCriteria Add<T>(string key, ICriteria criteria);
+
+ /// <summary>
+ /// Adds the specified detached criteria. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="detachedCriteria">The detached criteria.</param>
+ /// <returns></returns>
+ IMultiCriteria Add<T>(DetachedCriteria detachedCriteria);
+
+ /// <summary>
+ /// Adds the specified detached criteria, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="key">The key</param>
+ /// <param name="detachedCriteria">The detached criteria</param>
+ /// <returns></returns>
+ IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria);
+
+ /// <summary>
/// Adds the specified criteria to the query
/// </summary>
/// <param name="criteria">The criteria.</param>
Modified: trunk/nhibernate/src/NHibernate/IMultiQuery.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -11,11 +11,58 @@
public interface IMultiQuery
{
/// <summary>
- /// Get all the
+ /// Get all the results
/// </summary>
IList List();
/// <summary>
+ /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param>
+ /// <param name="criteria">The criteria.</param>
+ /// <returns></returns>
+ IMultiQuery Add(System.Type resultGenericListType, IQuery criteria);
+
+ /// <summary>
+ /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ IMultiQuery Add<T>(IQuery query);
+
+ /// <summary>
+ /// Add the specified HQL query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="key"></param>
+ /// <param name="query"></param>
+ /// <returns></returns>
+ IMultiQuery Add<T>(string key, IQuery query);
+
+ /// <summary>
+ /// Add the specified HQL Query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="key"></param>
+ /// <param name="hql"></param>
+ /// <returns></returns>
+ IMultiQuery Add<T>(string key, string hql);
+
+ /// <summary>
+ /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ IMultiQuery Add<T>(string hql);
+
+ /// <summary>
+ /// Add a named query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ IMultiQuery AddNamedQuery<T>(string namedQuery);
+
+ /// <summary>
+ /// Add a named query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/>
+ /// </summary>
+ /// <param name="key"></param>
+ /// <param name="namedKey"></param>
+ /// <returns></returns>
+ IMultiQuery AddNamedQuery<T>(string key, string namedKey);
+
+ /// <summary>
/// Add the specified HQL query to the multi query, and associate it with the given key
/// </summary>
/// <param name="key"></param>
Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -833,7 +833,7 @@
return List<T>();
}
- session.FutureQueryBatch.Add(this);
+ session.FutureQueryBatch.Add<T>(this);
return session.FutureQueryBatch.GetEnumerator<T>();
}
@@ -841,10 +841,10 @@
{
if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries)
{
- return new FutureValue<T>(List);
+ return new FutureValue<T>(List<T>);
}
- session.FutureQueryBatch.Add(this);
+ session.FutureQueryBatch.Add<T>(this);
return session.FutureQueryBatch.GetFutureValue<T>();
}
Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -375,25 +375,25 @@
{
if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries)
{
- return new FutureValue<T>(List);
+ return new FutureValue<T>(List<T>);
}
- session.FutureCriteriaBatch.Add(this);
+ session.FutureCriteriaBatch.Add<T>(this);
return session.FutureCriteriaBatch.GetFutureValue<T>();
}
- public IEnumerable<T> Future<T>()
- {
- if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries)
- {
+ public IEnumerable<T> Future<T>()
+ {
+ if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries)
+ {
return List<T>();
- }
+ }
- session.FutureCriteriaBatch.Add(this);
- return session.FutureCriteriaBatch.GetEnumerator<T>();
- }
+ session.FutureCriteriaBatch.Add<T>(this);
+ return session.FutureCriteriaBatch.GetEnumerator<T>();
+ }
- public object UniqueResult()
+ public object UniqueResult()
{
return AbstractQueryImpl.UniqueElement(List());
}
Modified: trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -5,7 +5,7 @@
{
internal class DelayedEnumerator<T> : IEnumerable<T>
{
- public delegate IList GetResult();
+ public delegate IList<T> GetResult();
private readonly GetResult result;
Modified: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -6,6 +6,8 @@
public class FutureCriteriaBatch
{
private readonly List<ICriteria> criterias = new List<ICriteria>();
+ private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>();
+
private int index;
private IList results;
private readonly ISession session;
@@ -22,9 +24,9 @@
if (results == null)
{
var multiCriteria = session.CreateMultiCriteria();
- foreach (var crit in criterias)
+ for (int i = 0; i < criterias.Count; i++)
{
- multiCriteria.Add(crit);
+ multiCriteria.Add(resultCollectionGenericType[i], criterias[i]);
}
results = multiCriteria.List();
((SessionImpl)session).FutureCriteriaBatch = null;
@@ -33,22 +35,28 @@
}
}
- public void Add(ICriteria criteria)
+ public void Add<T>(ICriteria criteria)
{
criterias.Add(criteria);
+ resultCollectionGenericType.Add(typeof(T));
index = criterias.Count - 1;
}
+ public void Add(ICriteria criteria)
+ {
+ Add<object>(criteria);
+ }
+
public IFutureValue<T> GetFutureValue<T>()
{
int currentIndex = index;
- return new FutureValue<T>(() => (IList)Results[currentIndex]);
+ return new FutureValue<T>(() => (IList<T>)Results[currentIndex]);
}
public IEnumerable<T> GetEnumerator<T>()
{
int currentIndex = index;
- return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]);
+ return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]);
}
}
}
Modified: trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -6,6 +6,8 @@
public class FutureQueryBatch
{
private readonly List<IQuery> queries = new List<IQuery>();
+ private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>();
+
private int index;
private IList results;
private readonly ISession session;
@@ -22,33 +24,39 @@
if (results == null)
{
var multiQuery = session.CreateMultiQuery();
- foreach (var crit in queries)
- {
- multiQuery.Add(crit);
- }
- results = multiQuery.List();
+ for (int i = 0; i < queries.Count; i++)
+ {
+ multiQuery.Add(resultCollectionGenericType[i], queries[i]);
+ }
+ results = multiQuery.List();
((SessionImpl)session).FutureQueryBatch = null;
}
return results;
}
}
- public void Add(IQuery query)
+ public void Add<T>(IQuery query)
+ {
+ queries.Add(query);
+ resultCollectionGenericType.Add(typeof(T));
+ index = queries.Count - 1;
+ }
+
+ public void Add(IQuery query)
{
- queries.Add(query);
- index = queries.Count - 1;
+ Add<object>(query);
}
public IFutureValue<T> GetFutureValue<T>()
{
int currentIndex = index;
- return new FutureValue<T>(() => (IList)Results[currentIndex]);
+ return new FutureValue<T>(() => (IList<T>)Results[currentIndex]);
}
public IEnumerable<T> GetEnumerator<T>()
{
int currentIndex = index;
- return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]);
+ return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]);
}
}
}
Modified: trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -1,10 +1,11 @@
using System.Collections;
+using System.Collections.Generic;
namespace NHibernate.Impl
{
internal class FutureValue<T> : IFutureValue<T>
{
- public delegate IList GetResult();
+ public delegate IList<T> GetResult();
private readonly GetResult getResult;
@@ -24,7 +25,7 @@
return default(T);
}
- return (T)result[0];
+ return result[0];
}
}
}
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -19,8 +19,9 @@
{
public class MultiCriteriaImpl : IMultiCriteria
{
- private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl));
- private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>();
+ private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl));
+ private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>();
+ private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>();
private readonly SessionImpl session;
private readonly ISessionFactoryImplementor factory;
@@ -90,6 +91,7 @@
return criteriaResults;
}
+
private IList ListUsingQueryCache()
{
IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion);
@@ -202,7 +204,16 @@
hydratedObjects[i] = entitySpan == 0 ? null : new ArrayList(entitySpan);
EntityKey[] keys = new EntityKey[entitySpan];
QueryParameters queryParameters = parameters[i];
- IList tmpResults = new ArrayList();
+ IList tmpResults;
+ if (resultCollectionGenericType[i] == typeof(object))
+ {
+ tmpResults = new ArrayList();
+ }
+ else
+ {
+ tmpResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i]));
+ }
+
RowSelection selection = parameters[i].RowSelection;
createSubselects[i] = loader.IsSubselectLoadingEnabled;
subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null;
@@ -327,37 +338,73 @@
}
return colIndex;
}
+
+ public IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria)
+ {
+ criteriaQueries.Add(criteria);
+ resultCollectionGenericType.Add(resultGenericListType);
- public IMultiCriteria Add(ICriteria criteria)
+ return this;
+ }
+
+ public IMultiCriteria Add(ICriteria criteria)
{
+ return Add<object>(criteria);
+ }
+
+ public IMultiCriteria Add(string key, ICriteria criteria)
+ {
+ return Add<object>(key, criteria);
+ }
+
+ public IMultiCriteria Add(DetachedCriteria detachedCriteria)
+ {
+ return Add<object>(detachedCriteria);
+ }
+
+ public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria)
+ {
+ return Add<object>(key, detachedCriteria);
+ }
+
+ public IMultiCriteria Add<T>(ICriteria criteria)
+ {
criteriaQueries.Add(criteria);
+ resultCollectionGenericType.Add(typeof(T));
+
return this;
}
- public IMultiCriteria Add(string key, ICriteria criteria)
+ public IMultiCriteria Add<T>(string key, ICriteria criteria)
{
ThrowIfKeyAlreadyExists(key);
criteriaQueries.Add(criteria);
criteriaResultPositions.Add(key, criteriaQueries.Count - 1);
+ resultCollectionGenericType.Add(typeof(T));
+
return this;
}
- public IMultiCriteria Add(DetachedCriteria detachedCriteria)
+ public IMultiCriteria Add<T>(DetachedCriteria detachedCriteria)
{
criteriaQueries.Add(
detachedCriteria.GetExecutableCriteria(session)
);
- return this;
- }
+ resultCollectionGenericType.Add(typeof (T));
- public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria)
- {
- ThrowIfKeyAlreadyExists(key);
- criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session));
- criteriaResultPositions.Add(key, criteriaQueries.Count-1);
return this;
}
+
+ public IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria)
+ {
+ ThrowIfKeyAlreadyExists(key);
+ criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session));
+ criteriaResultPositions.Add(key, criteriaQueries.Count - 1);
+ resultCollectionGenericType.Add(typeof(T));
+ return this;
+ }
+
public IMultiCriteria SetCacheable(bool cachable)
{
isCacheable = cachable;
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -22,9 +22,7 @@
private static readonly ILog log = LogManager.GetLogger(typeof(MultiQueryImpl));
private readonly List<IQuery> queries = new List<IQuery>();
- private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>();
- private readonly List<QueryParameters> parameters = new List<QueryParameters>();
- private IList queryResults;
+ private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); private readonly List<QueryParameters> parameters = new List<QueryParameters>(); private IList queryResults;
private readonly Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>();
private string cacheRegion;
private int commandTimeout = RowSelection.NoValue;
@@ -290,44 +288,80 @@
}
return this;
}
+
+ public IMultiQuery AddNamedQuery<T>(string key, string namedQuery)
+ {
+ ThrowIfKeyAlreadyExists(key);
+ return Add<T>(key, session.GetNamedQuery(namedQuery));
+ }
- public IMultiQuery Add(IQuery query)
+ public IMultiQuery Add(System.Type resultGenericListType, IQuery query)
{
- AddQueryForLaterExecutionAndReturnIndexOfQuery(query);
- return this;
- }
+ AddQueryForLaterExecutionAndReturnIndexOfQuery(resultGenericListType, query);
- public IMultiQuery Add(string key, IQuery query)
- {
- ThrowIfKeyAlreadyExists(key);
- criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(query));
return this;
}
- public IMultiQuery Add(string hql)
- {
- return Add(((ISession)session).CreateQuery(hql));
- }
+ public IMultiQuery Add(string key, IQuery query)
+ {
+ return Add<object>(key, query);
+ }
- public IMultiQuery Add(string key, string hql)
- {
- ThrowIfKeyAlreadyExists(key);
- return Add(key, ((ISession)session).CreateQuery(hql));
- }
+ public IMultiQuery Add(IQuery query)
+ {
+ return Add<object>(query);
+ }
- public IMultiQuery AddNamedQuery(string namedQuery)
- {
- return Add(session.GetNamedQuery(namedQuery));
- }
+ public IMultiQuery Add(string key, string hql)
+ {
+ return Add<object>(key, hql);
+ }
+ public IMultiQuery Add(string hql)
+ {
+ return Add<object>(hql);
+ }
- public IMultiQuery AddNamedQuery(string key, string namedQuery)
- {
- ThrowIfKeyAlreadyExists(key);
- return Add(key, session.GetNamedQuery(namedQuery));
- }
+ public IMultiQuery AddNamedQuery(string namedQuery)
+ {
+ return AddNamedQuery<object>(namedQuery);
+ }
- public IMultiQuery SetCacheable(bool cacheable)
+ public IMultiQuery AddNamedQuery(string key, string namedQuery)
+ {
+ return AddNamedQuery<object>(key, namedQuery);
+ }
+
+ public IMultiQuery Add<T>(IQuery query)
+ {
+ AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query);
+ return this;
+ }
+
+ public IMultiQuery Add<T>(string key, IQuery query)
+ {
+ ThrowIfKeyAlreadyExists(key);
+ criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query));
+ return this;
+ }
+
+ public IMultiQuery Add<T>(string hql)
+ {
+ return Add<T>(((ISession)session).CreateQuery(hql));
+ }
+
+ public IMultiQuery Add<T>(string key, string hql)
+ {
+ ThrowIfKeyAlreadyExists(key);
+ return Add<T>(key, ((ISession)session).CreateQuery(hql));
+ }
+
+ public IMultiQuery AddNamedQuery<T>(string namedQuery)
+ {
+ return Add<T>(session.GetNamedQuery(namedQuery));
+ }
+
+ public IMultiQuery SetCacheable(bool cacheable)
{
isCacheable = cacheable;
return this;
@@ -455,7 +489,15 @@
{
IQueryTranslator translator = Translators[i];
QueryParameters parameter = Parameters[i];
- ArrayList tempResults = new ArrayList();
+ IList tempResults;
+ if (resultCollectionGenericType[i] == typeof(object))
+ {
+ tempResults = new ArrayList();
+ }
+ else
+ {
+ tempResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i]));
+ }
int entitySpan = translator.Loader.EntityPersisters.Length;
hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null;
RowSelection selection = parameter.RowSelection;
@@ -496,8 +538,9 @@
hydratedObjects[i],
keys,
false);
- tempResults.Add(result);
+ tempResults.Add(result);
+
if (createSubselects[i])
{
subselectResultKeys[i].Add(keys);
@@ -792,11 +835,12 @@
}
}
- private int AddQueryForLaterExecutionAndReturnIndexOfQuery(IQuery query)
+ private int AddQueryForLaterExecutionAndReturnIndexOfQuery(System.Type resultGenericListType, IQuery query)
{
ThrowNotSupportedIfSqlQuery(query);
((AbstractQueryImpl)query).SetIgnoreUknownNamedParameters(true);
queries.Add(query);
+ resultCollectionGenericType.Add(resultGenericListType);
return queries.Count - 1;
}
protected void ThrowNotSupportedIfSqlQuery(IQuery query)
Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Reflection;
using NHibernate.Cache;
using NHibernate.Criterion;
@@ -504,5 +505,24 @@
s.Flush();
}
}
+
+ [Test]
+ public void CanGetResultInAGenericList()
+ {
+ using (ISession s = OpenSession())
+ {
+ ICriteria getItems = s.CreateCriteria(typeof(Item));
+ ICriteria countItems = s.CreateCriteria(typeof(Item))
+ .SetProjection(Projections.RowCount());
+
+ IMultiCriteria multiCriteria = s.CreateMultiCriteria()
+ .Add(getItems) // we expect a non-generic result from this (ArrayList)
+ .Add<int>(countItems); // we expect a generic result from this (List<int>)
+ IList results = multiCriteria.List();
+
+ Assert.IsInstanceOfType(typeof(ArrayList), results[0]);
+ Assert.IsInstanceOfType(typeof(List<int>), results[1]);
+ }
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 03:42:49 UTC (rev 4188)
+++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 14:15:48 UTC (rev 4189)
@@ -1,4 +1,5 @@
using System.Collections;
+using System.Collections.Generic;
using System.Reflection;
using NHibernate.Cache;
using NHibernate.Driver;
@@ -484,6 +485,24 @@
RemoveAllItems();
}
+ [Test]
+ public void CanGetResultsInAGenericList()
+ {
+ using (ISession s = OpenSession())
+ {
+ IQuery getItems = s.CreateQuery("from Item");
+ IQuery countItems = s.CreateQuery("select count(*) from Item");
+
+ IList results = s.CreateMultiQuery()
+ .Add(getItems)
+ .Add<long>(countItems)
+ .List();
+
+ Assert.IsInstanceOfType(typeof(ArrayList), results[0]);
+ Assert.IsInstanceOfType(typeof(List<long>), results[1]);
+ }
+ }
+
public class ResultTransformerStub : IResultTransformer
{
private bool _wasTransformTupleCalled;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|