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