Skip to content

NH-3859 - Exception when calling First on a GroupBy Query #1343

Open
@nhibernate-bot

Description

@nhibernate-bot

Dorian Rudolph created an issue — 15th March 2016, 14:26:16:

When First is called on a GroupBy query invalid SQL code seems to be generated:

Console.WriteLine(session.Query<Employee>().GroupBy(x => x.Name).First());

This causes the following Exception:

NHibernate.Exceptions.GenericADOException was unhandled
  HResult=-2146232832
  Message=could not execute query
< select TOP (1) employee0*.ID as ID0_, employee0_.Name as Name0_ from Employee employee0_ group by employee0*.Name >
[SQL: select TOP (1) employee0*.ID as ID0_, employee0_.Name as Name0_ from Employee employee0_ group by employee0*.Name]
  Source=NHibernate
  SqlString=select TOP (1) employee0*.ID as ID0_, employee0_.Name as Name0_ from Employee employee0_ group by employee0*.Name
  StackTrace:
       bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1668.
       bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1644.
       bei NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1536.
       bei NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1531.
       bei NHibernate.Loader.Hql.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Hql\QueryLoader.cs:Zeile 289.
       bei NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) in c:\Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:Zeile 110.
       bei NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\HQLQueryPlan.cs:Zeile 115.
       bei NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) in c:\Projects\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:Zeile 634.
       bei NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:Zeile 124.
       bei NHibernate.Impl.AbstractQueryImpl2.List() in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractQueryImpl2.cs:Zeile 81.
       bei NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 106.
       bei NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 41.
       bei NHibernate.Linq.DefaultQueryProvider.Execute<TResult>(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 46.
       bei System.Linq.Queryable.First<TSource>(IQueryable`1 source)
       bei NHibernateBasics.Program.Main() in C:\Users\dorud\Downloads\NHibernateBasics\NHibernateBasics\NHibernateBasics\Program.cs:Zeile 21.
       bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Data.SqlClient.SqlException
       HResult=-2146232060
       Message=Column 'Employee.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=16
       LineNumber=1
       Number=8120
       Procedure=""
       Server=(Local)\ENTW11
       State=1
       StackTrace:
            bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
            bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
            bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
            bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
            bei System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
            bei System.Data.SqlClient.SqlDataReader.get_MetaData()
            bei System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
            bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
            bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
            bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
            bei System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
            bei System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
            bei System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
            bei NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) in c:\Projects\nhibernate-core\src\NHibernate\AdoNet\AbstractBatcher.cs:Zeile 228.
            bei NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1288.
            bei NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 436.
            bei NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 252.
            bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer) in c:\Projects\nhibernate-core\src\NHibernate\Loader\Loader.cs:Zeile 1659.
       InnerException: 

The same error is also causes with FirstOrDefault, SingleOrDefault, Single.

A different exception is thrown when an additional Select statement is added:

// Some comments here
Console.WriteLine(session.Query<Employee>().GroupBy(x => x.Name).Select(x => x).First());
System.NotImplementedException was unhandled
  HResult=-2147467263
  Message=Die Methode oder der Vorgang ist nicht implementiert.
  Source=NHibernate
  StackTrace:
       bei NHibernate.Linq.GroupBy.NonAggregatingGroupByRewriter.FlattenSubQuery(SubQueryExpression subQueryExpression, QueryModel queryModel) in c:\Projects\nhibernate-core\src\NHibernate\Linq\GroupBy\NonAggregatingGroupByRewriter.cs:Zeile 58.
       bei NHibernate.Linq.GroupBy.NonAggregatingGroupByRewriter.ReWrite(QueryModel queryModel) in c:\Projects\nhibernate-core\src\NHibernate\Linq\GroupBy\NonAggregatingGroupByRewriter.cs:Zeile 33.
       bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:Zeile 32.
       bei NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter) in c:\Projects\nhibernate-core\src\NHibernate\Linq\NhLinqExpression.cs:Zeile 67.
       bei NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:Zeile 24.
       bei NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:Zeile 32.
       bei NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:Zeile 13.
       bei NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryPlanCache.cs:Zeile 67.
       bei NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:Zeile 412.
       bei NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:Zeile 372.
       bei NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 73.
       bei NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 39.
       bei NHibernate.Linq.DefaultQueryProvider.Execute<TResult>(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 46.
       bei System.Linq.Queryable.First<TSource>(IQueryable`1 source)
       bei NHibernateBasics.Program.Main() in C:\Users\dorud\Downloads\NHibernateBasics\NHibernateBasics\NHibernateBasics\Program.cs:Zeile 21.
       bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

However, calling ToList does not cause an exception:

Console.WriteLine(session.Query<Employee>().GroupBy(x => x.Name).Select(x => x).ToList().First());

This would generate the following SQL code:

select employee0*.ID as ID0_, employee0_.Name as Name0_ from Employee employee0*

Using Take causes the same error as First:

Console.WriteLine(session.Query<Employee>().GroupBy(x => x.Name).Select(x => x).Take(1).ToList().First());

Dorian Rudolph added a comment — 16th March 2016, 9:03:38:

Calling OrderBy on a GroupBy query yields yet another exception:

var t = session.Query<Employee>().GroupBy(x => x.Name).OrderBy(x => x.Key).ToList();
NHibernate.HibernateException was unhandled
  HResult=-2146232832
  Message=Query Source could not be identified: ItemName = x, ItemType = System.Linq.IGrouping`2<System.String,NHibernateBasics.Employee>, Expression = from IGrouping`2 x in {value(NHibernate.Linq.NhQueryable`1<NHibernateBasics.Employee>) => GroupBy(<x>.Name, [x])}
  Source=NHibernate
  StackTrace:
       bei NHibernate.Linq.QuerySourceNamer.GetName(IQuerySource querySource) in c:\Projects\nhibernate-core\src\NHibernate\Linq\QuerySourceNamer.cs:Zeile 30.
       bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitQuerySourceReferenceExpression(QuerySourceReferenceExpression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs:Zeile 200.
       bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs:Zeile 116.
       bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMemberExpression(MemberExpression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs:Zeile 381.
       bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs:Zeile 92.
       bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.Visit(Expression expression, VisitorParameters parameters) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs:Zeile 23.
       bei NHibernate.Linq.Visitors.QueryModelVisitor.VisitOrderByClause(OrderByClause orderByClause, QueryModel queryModel, Int32 index) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:Zeile 258.
       bei Remotion.Linq.Clauses.OrderByClause.Accept(IQueryModelVisitor visitor, QueryModel queryModel, Int32 index)
       bei Remotion.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection`1 bodyClauses, QueryModel queryModel)
       bei Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
       bei NHibernate.Linq.Visitors.QueryModelVisitor.Visit() in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:Zeile 122.
       bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root) in c:\Projects\nhibernate-core\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:Zeile 68.
       bei NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter) in c:\Projects\nhibernate-core\src\NHibernate\Linq\NhLinqExpression.cs:Zeile 67.
       bei NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:Zeile 24.
       bei NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:Zeile 32.
       bei NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:Zeile 13.
       bei NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) in c:\Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryPlanCache.cs:Zeile 67.
       bei NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:Zeile 412.
       bei NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in c:\Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:Zeile 372.
       bei NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 73.
       bei NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 39.
       bei NHibernate.Linq.DefaultQueryProvider.Execute<TResult>(Expression expression) in c:\Projects\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:Zeile 46.
       bei Remotion.Linq.QueryableBase`1.GetEnumerator()
       bei System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       bei System.Linq.Enumerable.ToList<TSource>(IEnumerable`1 source)
       bei NHibernateBasics.Program.Main() in C:\Users\dorud\Downloads\NHibernateBasics\NHibernateBasics\NHibernateBasics\Program.cs:Zeile 21.
       bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException: 


lnu added a comment — 24th March 2016, 9:05:46:

related to https://nhibernate.jira.com/browse/NH-3027?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions