Closed
Description
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);
}