Skip to content

Unable to use external predicate in subquery #2540

Closed
@krzkowal

Description

@krzkowal

While this query works as expected:

[Test]
public void CanSelectWithWhereSubQuery()
{
    var query = from timesheet in db.Timesheets
                select new
                {
                    timesheet.Id,
                    Entries = timesheet.Entries.Where(e => e.NumberOfHours >= 0).ToList()
                };

    var list = query.ToList();

    Assert.AreEqual(3, list.Count);
}

(The test is a modified version of the already exising Linq/SelectionTests.CanSelectWithAnySubQuery)

The next test generates incorrect SQL query which results in an exception when executed

[Test]
public void CanSelectWithAsQueryableAndWhereSubQueryWithExternalPredicate()
{
    Expression<Func<TimesheetEntry, bool>> predicate = e => e.NumberOfHours >= 0;

    var query = from timesheet in db.Timesheets
                select new
                {
                    timesheet.Id,
                    Entries = timesheet.Entries.AsQueryable().Where(predicate).ToList()
                };

    var list = query.ToList();

    Assert.AreEqual(3, list.Count);
}
Error details
NHibernate.Exceptions.GenericADOException : could not execute query
[ select timesheet0_.TimesheetId as col_0_0_, (select entries1_.TimesheetEntryId from TimesheetEntries entries1_ where timesheet0_.TimesheetId=entries1_.TimesheetID and entries1_.NumberOfHours>=@p0) as col_1_0_ from Timesheets timesheet0_ ]
  Name:p1 - Value:0
[SQL: select timesheet0_.TimesheetId as col_0_0_, (select entries1_.TimesheetEntryId from TimesheetEntries entries1_ where timesheet0_.TimesheetId=entries1_.TimesheetID and entries1_.NumberOfHours>=@p0) as col_1_0_ from Timesheets timesheet0_]
  ----> System.Data.SqlClient.SqlException : Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Data:
  HelpLink.ProdName: Microsoft SQL Server
  HelpLink.ProdVer: 14.00.3192
  HelpLink.EvtSrc: MSSQLServer
  HelpLink.EvtID: 512
  HelpLink.BaseHelpUrl: http://go.microsoft.com/fwlink
  HelpLink.LinkId: 20476
  actual-sql-query: select timesheet0_.TimesheetId as col_0_0_, (select entries1_.TimesheetEntryId from TimesheetEntries entries1_ where timesheet0_.TimesheetId=entries1_.TimesheetID and entries1_.NumberOfHours>=@p0) as col_1_0_ from Timesheets timesheet0_

   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1981
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1950
   at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1837
   at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1827
   at NHibernate.Loader.Hql.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) in D:\src\nhibernate-core\src\NHibernate\Loader\Hql\QueryLoader.cs:line 325
   at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) in D:\src\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 131
   at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) in D:\src\nhibernate-core\src\NHibernate\Engine\Query\HQLQueryPlan.cs:line 115
   at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results, Object filterConnection) in D:\src\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 559
   at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) in D:\src\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 523
   at NHibernate.Impl.AbstractSessionImpl.List[T](IQueryExpression query, QueryParameters parameters) in D:\src\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:line 182
   at NHibernate.Impl.AbstractQueryImpl2.List[T]() in D:\src\nhibernate-core\src\NHibernate\Impl\AbstractQueryImpl2.cs:line 111
   at NHibernate.Linq.DefaultQueryProvider.ExecuteList[TResult](Expression expression) in D:\src\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:line 111
   at NHibernate.Linq.NhQueryable`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in D:\src\nhibernate-core\src\NHibernate\Linq\NhQueryable.cs:line 65
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at NHibernate.Test.Linq.SelectionTests.CanSelectWithAsQueryableAndWhereSubQueryWithExternalPredicate() in D:\src\nhibernate-core\src\NHibernate.Test\Linq\SelectionTests.cs:line 345
--SqlException
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
   at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   at System.Data.SqlClient.SqlDataReader.Read()
   at NHibernate.Driver.NHybridDataReader.Read() in D:\src\nhibernate-core\src\NHibernate\Driver\NHybridDataReader.cs:line 127
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 558
   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 303
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) in D:\src\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1972

The same error occurs when only the AsQueryable method was added to the subquery

[Test]
public void CanSelectWithAsQueryableAndWhereSubQuery()
{
    var query = from timesheet in db.Timesheets
                select new
                {
                    timesheet.Id,
                    Entries = timesheet.Entries.AsQueryable().Where(e => e.NumberOfHours >= 0).ToList()
                };

    var list = query.ToList();

    Assert.AreEqual(3, list.Count);
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions