Sir Steve Strong knows it, don't worry. On Mon, Jul 5, 2010 at 3:39 PM, Diego Mijelshon <di...@mijelshon.com.ar>wrote:
> It's not necessarily a bug in the code. > An exception is just that: a state that deviates from the rule. > While the code shouldn't be designed around exceptions, it can happen that, > given a spec of "there can be one and only one X where Y=Z" you try to > retrieve it using Single and, somehow (say, because of a faulty import > process), there are more (or none) in the DB. > If that happens, I think it's important to fail with the least possible > impact to the rest of the application. > > If you disagree, tell Steve :-) > This happens in > NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessFirstOrSingleBase.cs > > Diego > > > > On Mon, Jul 5, 2010 at 14:29, Fabio Maulo <fabioma...@gmail.com> wrote: > >> If you write a query that may return 10 records and there you put "Single" >> you are foo or you have a bug. >> That is what "Single" mean and for that reason it throw exception when >> more than one instance are selected. >> >> In NH we don't have to change its meaning putting an unnecessary >> pagination (SetMaxResults) in the result SQL. >> >> On Mon, Jul 5, 2010 at 2:19 PM, Diego Mijelshon >> <di...@mijelshon.com.ar>wrote: >> >>> I can't think of a better way to do it. >>> >>> For Single, this is the behavior: >>> - Request at most 2 records from the server (to avoid doing extra work) >>> - If no records returned, exception >>> - If one record returned, map it and we're done >>> - If more than one record returned, exception >>> >>> For SingleOrDefault is the same, only the first case returns null. >>> >>> How would you improve it? >>> >>> Diego >>> >>> >>> >>> On Mon, Jul 5, 2010 at 12:32, Fabio Maulo <fabioma...@gmail.com> wrote: >>> >>>> There is no need to complicate the query for "Single" >>>> >>>> -- >>>> Fabio Maulo >>>> >>>> >>>> El 05/07/2010, a las 12:16, Diego Mijelshon <di...@mijelshon.com.ar> >>>> escribió: >>>> >>>> IIRC, Single/SingleOrDefault use SetMaxResults(2), and then checks that >>>> a single record is returned... >>>> >>>> Diego >>>> >>>> >>>> On Mon, Jul 5, 2010 at 10:19, Fabio Maulo < <fabioma...@gmail.com> >>>> fabioma...@gmail.com> wrote: >>>> >>>>> For "First" and "FirstOrDefault" we can apply SetMaxResults(1) ... and >>>>> fix the bug (please check last JIRAs and add a new one if you can't find >>>>> an >>>>> existing) >>>>> >>>>> For "Single" and "SingleOrDefault" we *shouldn't*apply SetMaxResults(1) >>>>> because doing so we will change the >>>>> "Single" behavior (it should throw exception when there are more than one >>>>> results) >>>>> >>>>> >>>>> On Mon, Jul 5, 2010 at 10:11 AM, andrew6072 >>>>> <<andrew.brun...@ukfuels.co.uk> >>>>> andrew.brun...@ukfuels.co.uk> wrote: >>>>> >>>>>> Hi Fabio, >>>>>> >>>>>> What do you mean by changing the meaning of Single ? >>>>>> >>>>>> Oh and It also happens with First(), and SingleOrDefault() as well >>>>>> >>>>>> It seems to be something to do with this call >>>>>> >>>>>> bool useLimit = UseLimit(selection, dialect); >>>>>> when I use Query<> it returns true, and if I use QueryOver<> it return >>>>>> false ??? >>>>>> >>>>>> I don't really understand how it all works but I've noticed the >>>>>> following. >>>>>> when its called using Query<> selection.firstrow = -1, and >>>>>> selection.MaxRows = 1 >>>>>> >>>>>> but when its called from QueryOver<> selection.FirstRow = 0, and >>>>>> selection.Maxrows = -1 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> Andrew >>>>>> >>>>>> >>>>>> On Jul 5, 12:38 pm, Fabio Maulo <fabioma...@gmail.com> wrote: >>>>>> > Confirmed, we have a bug. >>>>>> > We are changing the meaning of Single. >>>>>> > >>>>>> > >>>>>> > >>>>>> > On Mon, Jul 5, 2010 at 8:35 AM, Fabio Maulo <fabioma...@gmail.com> >>>>>> wrote: >>>>>> > > If our provider creates a paginated query for the method "Single" >>>>>> we have a >>>>>> > > bug. >>>>>> > >>>>>> > > On Mon, Jul 5, 2010 at 8:06 AM, andrew6072 < >>>>>> andrew.brun...@ukfuels.co.uk>wrote: >>>>>> > >>>>>> > >> Hi Fabio, >>>>>> > >>>>>> > >> I think the exception got chopped off, this is the full >>>>>> exception. >>>>>> > >>>>>> > >> [SQL: select * from ( select olauser0_.USER_ID as USER1_57_, >>>>>> > >> olauser0_.USERNAME as USERNAME57_, olauser0_.EMAIL_ADDRESS as >>>>>> > >> EMAIL3_57_, olauser0_.COMMENTS as COMMENTS57_, olauser0_.PASSWORD >>>>>> as >>>>>> > >> PASSWORD57_, olauser0_.PASSWORD_QUESTION as PASSWORD6_57_, >>>>>> > >> olauser0_.PASSWORD_ANSWER as PASSWORD7_57_, olauser0_.IS_APPROVED >>>>>> as >>>>>> > >> IS8_57_, olauser0_.IS_LOCKEDOUT as IS9_57_, >>>>>> olauser0_.LAST_LOGON_DATE >>>>>> > >> as LAST10_57_, olauser0_.CREATION_DATE as CREATION11_57_, >>>>>> > >> olauser0_.LAST_ACTIVITY_DATE as LAST12_57_, >>>>>> > >> olauser0_.LAST_PASSWORD_CHANGED_DATE as LAST13_57_, >>>>>> > >> olauser0_.LAST_LOCKOUT_DATE as LAST14_57_ from OLA_USERS >>>>>> olauser0_ >>>>>> > >> where (olauser0_.USERNAME is null) and (:p0 is null) or >>>>>> > >> olauser0_.USERNAME=:p0 ) where rownum <=:p2] ---> >>>>>> > >> Oracle.DataAccess.Client.OracleException ORA-01008: not all >>>>>> variables >>>>>> > >> bound at >>>>>> > >> Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 >>>>>> > >> errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* >>>>>> > >> pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) >>>>>> > >> at Oracle.DataAccess.Client.OracleException.HandleError(Int32 >>>>>> > >> errCode, OracleConnection conn, String procedure, IntPtr >>>>>> opsErrCtx, >>>>>> > >> OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) >>>>>> > >> at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean >>>>>> > >> requery, Boolean fillRequest, CommandBehavior behavior) >>>>>> > >> at >>>>>> > >> >>>>>> Oracle.DataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior >>>>>> > >> behavior) >>>>>> > >> at >>>>>> > >> >>>>>> System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() >>>>>> > >> at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand >>>>>> cmd) >>>>>> > >> in >>>>>> d:\dev\oss\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line >>>>>> > >> 242 >>>>>> > >> at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean >>>>>> > >> autoDiscoverTypes, Boolean callable, RowSelection selection, >>>>>> > >> ISessionImplementor session) in >>>>>> d:\dev\oss\nhibernate\src\NHibernate >>>>>> > >> \Loader\Loader.cs:line 1325 >>>>>> > >> at NHibernate.Loader.Loader.DoQuery(ISessionImplementor >>>>>> session, >>>>>> > >> QueryParameters queryParameters, Boolean returnProxies) in >>>>>> d:\dev\oss >>>>>> > >> \nhibernate\src\NHibernate\Loader\Loader.cs:line 401 >>>>>> > >> at >>>>>> > >>>>>> > >> >>>>>> NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor >>>>>> > >> session, QueryParameters queryParameters, Boolean returnProxies) >>>>>> in d: >>>>>> > >> \dev\oss\nhibernate\src\NHibernate\Loader\Loader.cs:line 236 >>>>>> > >> at NHibernate.Loader.Loader.DoList(ISessionImplementor session, >>>>>> > >> QueryParameters queryParameters) in d:\dev\oss\nhibernate\src >>>>>> > >> \NHibernate\Loader\Loader.cs:line 1653 >>>>>> > >> --- End of inner exception stack trace --- >>>>>> > >> at NHibernate.Loader.Loader.DoList(ISessionImplementor >>>>>> session, >>>>>> > >> QueryParameters queryParameters) in d:\dev\oss\nhibernate\src >>>>>> > >> \NHibernate\Loader\Loader.cs:line 1662 >>>>>> > >> at >>>>>> > >> NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor >>>>>> > >> session, QueryParameters queryParameters) in >>>>>> d:\dev\oss\nhibernate\src >>>>>> > >> \NHibernate\Loader\Loader.cs:line 1577 >>>>>> > >> at NHibernate.Loader.Loader.List(ISessionImplementor session, >>>>>> > >> QueryParameters queryParameters, ISet`1 querySpaces, IType[] >>>>>> > >> resultTypes) in d:\dev\oss\nhibernate\src\NHibernate\Loader >>>>>> > >> \Loader.cs:line 1567 >>>>>> > >> at >>>>>> > >> >>>>>> NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor >>>>>> > >> session, QueryParameters queryParameters) in >>>>>> d:\dev\oss\nhibernate\src >>>>>> > >> \NHibernate\Hql\Ast\ANTLR\Loader\QueryLoader.cs:line 297 >>>>>> > >> at >>>>>> > >> >>>>>> NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor >>>>>> > >> session, QueryParameters queryParameters) in >>>>>> d:\dev\oss\nhibernate\src >>>>>> > >> \NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 107 >>>>>> > >> at >>>>>> NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters >>>>>> > >> queryParameters, ISessionImplementor session, IList results) in >>>>>> d:\dev >>>>>> > >> \oss\nhibernate\src\NHibernate\Engine\Query\HQLQueryPlan.cs:line >>>>>> 105 >>>>>> > >> at NHibernate.Impl.SessionImpl.List(IQueryExpression >>>>>> > >> queryExpression, QueryParameters queryParameters, IList results) >>>>>> in d: >>>>>> > >> \dev\oss\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 676 >>>>>> > >> at NHibernate.Impl.SessionImpl.List(IQueryExpression >>>>>> > >> queryExpression, QueryParameters parameters) in >>>>>> d:\dev\oss\nhibernate >>>>>> > >> \src\NHibernate\Impl\SessionImpl.cs:line 655 >>>>>> > >> at NHibernate.Impl.ExpressionQueryImpl.List() in d:\dev\oss >>>>>> > >> \nhibernate\src\NHibernate\Impl\ExpressionQueryImpl.cs:line 63 >>>>>> > >> at NHibernate.Linq.NhQueryProvider.Execute(Expression >>>>>> expression) >>>>>> > >> in >>>>>> d:\dev\oss\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line >>>>>> > >> 31 >>>>>> > >> at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression >>>>>> > >> expression) in d:\dev\oss\nhibernate\src\NHibernate\Linq >>>>>> > >> \NhQueryProvider.cs:line 55 >>>>>> > >> at System.Linq.Queryable.Single[TSource](IQueryable`1 source) >>>>>> > >> at >>>>>> > >> >>>>>> OlaCommon.Data.Repository.NHibernate.UserRepository.GetByUsername(String >>>>>> > >> username) in >>>>>> d:\dev\tfs\OlaCommon\OlaCommon.Data\Repository\NHibernate >>>>>> > >> \UserRepository.cs:line 27 >>>>>> > >> at >>>>>> > >> >>>>>> OlaMonitor.Infrastructure.NHibernateMembershipProvider.ValidateUser(String >>>>>> > >> username, String password) in d:\dev\tfs\OlaMonitor\OlaMonitor >>>>>> > >> \Infrastructure\NHibernateMembershipProvider.cs:line 248 >>>>>> > >>>>>> > >> Validateuser calls the following method >>>>>> > >> public OlaUser GetByUsername(string username) >>>>>> > >> { >>>>>> > >> var session = GetSession(); >>>>>> > >> var query = (from a in session.Query<OlaUser>() >>>>>> > >> where a.Username == username >>>>>> > >> select a); >>>>>> > >> var user = query.Single(); >>>>>> > >> return user; >>>>>> > >> } >>>>>> > >>>>>> > >> Do you need anything else ? >>>>>> > >>>>>> > >> Andrew >>>>>> > >>>>>> > >> On Jul 5, 11:43 am, Fabio Maulo <fabioma...@gmail.com> wrote: >>>>>> > >> > Please send us something else... In some point you are forcing >>>>>> the >>>>>> > >> > pagination of the query. >>>>>> > >>>>>> > >> > -- >>>>>> > >> > Fabio Maulo >>>>>> > >>>>>> > >> > El 05/07/2010, a las 07:16, andrew6072 < >>>>>> andrew.brun...@ukfuels.co.uk> >>>>>> > >> escribió: >>>>>> > >>>>>> > >> > > Hi, >>>>>> > >>>>>> > >> > > Not sure if I've done something wrong but I can't get this to >>>>>> work, if >>>>>> > >> > > I look at the query I can see one object, as soon as it hits >>>>>> the >>>>>> > >> > > query.single() it bombs with the stack below, am I missing >>>>>> something ? >>>>>> > >> > > Not sure if it makes any difference but I'm using fluent to >>>>>> create my >>>>>> > >> > > mappings. >>>>>> > >>>>>> > >> > > var query = (from a in session.Query<OlaUser>() >>>>>> > >> > > where a.Username == username >>>>>> > >> > > select a); >>>>>> > >>>>>> > >> > > var user = query.Single(); >>>>>> > >>>>>> > >> > > Andrew >>>>>> > >>>>>> > >> > > [ select * from ( select olauser0_.USER_ID as USER1_57_, >>>>>> > >> > > olauser0_.USERNAME as USERNAME57_, olauser0_.EMAIL_ADDRESS as >>>>>> > >> > > EMAIL3_57_, olauser0_.COMMENTS as COMMENTS57_, >>>>>> olauser0_.PASSWORD as >>>>>> > >> > > PASSWORD57_, olauser0_.PASSWORD_QUESTION as PASSWORD6_57_, >>>>>> > >> > > olauser0_.PASSWORD_ANSWER as PASSWORD7_57_, >>>>>> olauser0_.IS_APPROVED as >>>>>> > >> > > IS8_57_, olauser0_.IS_LOCKEDOUT as IS9_57_, >>>>>> olauser0_.LAST_LOGON_DATE >>>>>> > >> > > as LAST10_57_, olauser0_.CREATION_DATE as CREATION11_57_, >>>>>> > >> > > olauser0_.LAST_ACTIVITY_DATE as LAST12_57_, >>>>>> > >> > > olauser0_.LAST_PASSWORD_CHANGED_DATE as LAST13_57_, >>>>>> > >> > > olauser0_.LAST_LOCKOUT_DATE as LAST14_57_ from USERS >>>>>> olauser0_ where >>>>>> > >> > > (olauser0_.USERNAME is null) and (:p0 is null) or >>>>>> > >> > > olauser0_.USERNAME=:p0 ) where rownum <=:p2 ] >>>>>> > >> > > Name:p1 - Value:andrewb >>>>>> > >>>>>> > >> > > Oracle.DataAccess.Client.OracleException ORA-01008: not all >>>>>> variables >>>>>> > >> > > bound at >>>>>> > >> > > >>>>>> Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 >>>>>> > >> > > errCode, OracleConnection conn, IntPtr opsErrCtx, >>>>>> OpoSqlValCtx* >>>>>> > >> > > pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) >>>>>> > >> > > at >>>>>> Oracle.DataAccess.Client.OracleException.HandleError(Int32 >>>>>> > >> > > errCode, OracleConnection conn, String procedure, IntPtr >>>>>> opsErrCtx, >>>>>> > >> > > OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) >>>>>> > >> > > at >>>>>> Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean >>>>>> > >> > > requery, Boolean fillRequest, CommandBehavior behavior) >>>>>> > >> > > at >>>>>> > >>>>>> > >> >>>>>> Oracle.DataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior >>>>>> > >> > > behavior) >>>>>> > >> > > at >>>>>> > >> > > >>>>>> System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() >>>>>> > >> > > at >>>>>> NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) >>>>>> > >> > > in >>>>>> d:\dev\oss\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line >>>>>> > >> > > 242 >>>>>> > >> > > at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, >>>>>> Boolean >>>>>> > >> > > autoDiscoverTypes, Boolean callable, RowSelection selection, >>>>>> > >> > > ISessionImplementor session) in >>>>>> d:\dev\oss\nhibernate\src\NHibernate >>>>>> > >> > > \Loader\Loader.cs:line 1325 >>>>>> > >> > > at NHibernate.Loader.Loader.DoQuery(ISessionImplementor >>>>>> session, >>>>>> > >> > > QueryParameters queryParameters, Boolean returnProxies) in >>>>>> d:\dev\oss >>>>>> > >> > > \nhibernate\src\NHibernate\Loader\Loader.cs:line 401 >>>>>> > >> > > at >>>>>> > >>>>>> > >> >>>>>> NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor >>>>>> > >> > > session, QueryParameters queryParameters, Boolean >>>>>> returnProxies) in d: >>>>>> > >> > > \dev\oss\nhibernate\src\NHibernate\Loader\Loader.cs:line 236 >>>>>> > >> > > at NHibernate.Loader.Loader.DoList(ISessionImplementor >>>>>> session, >>>>>> > >> > > QueryParameters queryParameters) in d:\dev\oss\nhibernate\src >>>>>> > >> > > \NHibernate\Loader\Loader.cs:line 1653 >>>>>> > >> > > 2010-07-05 10:54:20,134 [9] WARN >>>>>> NHibernate.Util.ADOExceptionReporter >>>>>> > >> > > - Oracle.DataAccess.Client.OracleException ORA-01008: not all >>>>>> > >> > > variables bound at >>>>>> > >> > > >>>>>> Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 >>>>>> > >> > > errCode, OracleConnection conn, IntPtr opsErrCtx, >>>>>> OpoSqlValCtx* >>>>>> > >> > > pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) >>>>>> > >>>>>> > ... >>>>>> > >>>>>> > read more »- Hide quoted text - >>>>>> > >>>>>> > - Show quoted text - >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "nhusers" group. >>>>>> To post to this group, send email to <nhusers@googlegroups.com> >>>>>> nhus...@googlegroups.com. >>>>>> To unsubscribe from this group, send email to >>>>>> <nhusers%2bunsubscr...@googlegroups.com> >>>>>> nhusers+unsubscr...@googlegroups.com. >>>>>> For more options, visit this group at >>>>>> <http://groups.google.com/group/nhusers?hl=en> >>>>>> http://groups.google.com/group/nhusers?hl=en. >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Fabio Maulo >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "nhusers" group. >>>>> To post to this group, send email to <nhusers@googlegroups.com> >>>>> nhus...@googlegroups.com. >>>>> To unsubscribe from this group, send email to >>>>> <nhusers%2bunsubscr...@googlegroups.com> >>>>> nhusers+unsubscr...@googlegroups.com. >>>>> For more options, visit this group at >>>>> <http://groups.google.com/group/nhusers?hl=en> >>>>> http://groups.google.com/group/nhusers?hl=en. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "nhusers" group. >>>> To post to this group, send email to nhus...@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> nhusers+unsubscr...@googlegroups.com. >>>> For more options, visit this group at >>>> http://groups.google.com/group/nhusers?hl=en. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "nhusers" group. >>>> To post to this group, send email to nhus...@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> nhusers+unsubscr...@googlegroups.com<nhusers%2bunsubscr...@googlegroups.com> >>>> . >>>> For more options, visit this group at >>>> http://groups.google.com/group/nhusers?hl=en. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "nhusers" group. >>> To post to this group, send email to nhus...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> nhusers+unsubscr...@googlegroups.com<nhusers%2bunsubscr...@googlegroups.com> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/nhusers?hl=en. >>> >> >> >> >> -- >> Fabio Maulo >> >> -- >> You received this message because you are subscribed to the Google Groups >> "nhusers" group. >> To post to this group, send email to nhus...@googlegroups.com. >> To unsubscribe from this group, send email to >> nhusers+unsubscr...@googlegroups.com<nhusers%2bunsubscr...@googlegroups.com> >> . >> For more options, visit this group at >> http://groups.google.com/group/nhusers?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to nhus...@googlegroups.com. > To unsubscribe from this group, send email to > nhusers+unsubscr...@googlegroups.com<nhusers%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > -- Fabio Maulo -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to nhus...@googlegroups.com. To unsubscribe from this group, send email to nhusers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.