Hql + SetFirstResult + SetMaxResult + Lazy Loading - nhibernate

I have this query
var hql = #"from Table1 tbl1
left join fetch tbl1.Table2";
var c =session.CreateQuery(hql).SetFirstResult(1).SetMaxResults(5)
.List<Table1>().ToList();
It keeps on dieing.
NHibernate.Exceptions.GenericADOException was unhandled by user code
Message=Could not execute query[SQL: SQL not available]
Source=NHibernate
SqlString=SQL not available
StackTrace:
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results)
at NHibernate.Impl.SessionImpl.List[T](String query, QueryParameters parameters)
at NHibernate.Impl.QueryImpl.List[T]()
at MvcApplication1.Controllers.Default1Controller.ThenInHql() in MvcApplication1\MvcApplication1\Controllers\Default1Controller.cs:line 152
at MvcApplication1.Controllers.Default1Controller.Index() in MvcApplication1\MvcApplication1\Controllers\Default1Controller.cs:line 21
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException: System.ArgumentNullException
Message=Value cannot be null.
Parameter name: source
Source=System.Core
ParamName=source
StackTrace:
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at NHibernate.Engine.QueryParameters.CreateCopyUsing(RowSelection selection)
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results)
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results)
InnerException:
Edit
nhibernate profiler is telling me that it is like a casting problem?
ERROR:
The value "System.Object[]" is not of type "MvcApplication1.Models.Table1" and cannot be used in this generic collection.
Parameter name: value

NHibernate ICriteria’s SetFirstResult is ZERO BASED! First Result might indicate that it starts with 1 but it doesnt. SetFirstResult(1).SetMaxResults(5) is probably not what you’re trying to do.
change it to SetFirstResult(0).SetMaxResults(5)

Related

NHibernate create criteria, add Restrictions on related table with nullable foreign key

I work on a Api project in .NET core 2.2 with NHibernate (5.2.5)
Table A has nullable foreign key from table B
I need to create a criteria to filter Table A, using a nullable foreign key (which is not null) that points to Table B, where the Status in Table B is 3
This is something what I have tried:
var criteria = _session.CreateCriteria<AgencyAgreement>();criteria.Add(Restrictions.Eq("BookingCartItem.Status", (int)BookingCartStatus.Cancelled));
also with and operator
criteria.Add(Restrictions.And(Restrictions.IsNotNull("BookingCartItem"), Restrictions.Eq("BookingCartItem.Status", (int)BookingCartStatus.Cancelled)));
but this is what I get as Error
at NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName)\r\n at NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String alias, String propertyName)\r\n at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName)\r\n at NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName, Object value, ICriterion critertion)\r\n at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)\r\n at NHibernate.Criterion.LogicalExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)\r\n at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition()\r\n at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary2 enabledFilters)\r\n at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary2 enabledFilters)\r\n at NHibernate.Impl.SessionImpl.ListAsync(CriteriaImpl criteria, IList results, CancellationToken cancellationToken)\r\n at NHibernate.Impl.CriteriaImpl.ListAsync(IList results, CancellationToken cancellationToken)\r\n at NHibernate.Impl.CriteriaImpl.ListAsync[T](CancellationToken cancellationToken)\r\n at HASELT.merakzy.Services.Features.Documents.QueryTravelAgreements.Handler.Handle(Request request, CancellationToken cancellationToken) in C:\Users\Asus\Desktop\merakzy-sourcecode\merakzy-master\src\HASELT.merakzy.Services\Features\AgencyDocuments\QueryTravelAgreements.cs:line 115\r\n at MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 next)\r\n at MediatR.Pipeline.RequestPreProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 next)\r\n at lambda_method(Closure , Object )\r\n at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\r\n at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\r\n at System.Threading.Tasks.ValueTask`1.get_Result()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()
var criteria = _session.CreateCriteria<AgencyAgreement>();
criteria.CreateCriteria(nameof(AgencyAgreement.BookingCartItem))
.Add(Restrictions.Eq("Status", (int)BookingCartStatus.Cancelled));
or using linq if the properties are known at compile time
var query = _session.Query<AgencyAgreement>();
query = query.Where(a => a.BookingCartItem.Status == (int)BookingCartStatus.Cancelled);

SQLite CASE/WHEN isnumeric query

I have the following code that works in SQL:
"(CASE WHEN isnumeric(Installation) > 0 THEN cast(Installation as bigint) ELSE null END) "
I am trying to convert it to work in SQLite, but having trouble since I have very little experience in SQLite. Basically I want to cast/convert my stringcolumn (Installation) to a bigint, but need the validation to make sure it only contains numeric characters.
I have tried the following 3 variations, but not having luck. Just getting errors saying could not execute query
("(CASE WHEN Installation GLOB '*[^0-9]*' THEN cast(Installation as bigint) ELSE null END)");
("(SELECT Installation from ShortCycleWorkOrderCompletions WHERE Installation = REGEXP '*[^0-9]*'");
("(CASE WHEN REGEXP(Installation, '*[^0-9]*') THEN cast(Installation as bigint) ELSE null END");
Don't need all 3 to work, just one, and these were what I have tried.
NHibernate.Exceptions.GenericADOException: could not load an entity: [MapCall.Common.Model.Entities.ShortCycleWorkOrderCompletion#666][SQL: SELECT shortcycle0_.Id as Id510_0_, shortcycle0_.SAPCommunicationError as SAPCommu2_510_0_, shortcycle0_.SAPErrorCode as SAPError3_510_0_, shortcycle0_.ActiveMQStatus as ActiveMQ4_510_0_, shortcycle0_.WorkOrderNumber as WorkOrde5_510_0_, shortcycle0_.MiscInvoice as MiscInvo6_510_0_, shortcycle0_.BackOfficeReview as BackOffi7_510_0_, shortcycle0_.CompletionStatus as Completi8_510_0_, shortcycle0_.Notes as Notes510_0_, shortcycle0_.AdditionalWorkNeeded as Additio10_510_0_, shortcycle0_.Purpose as Purpose510_0_, shortcycle0_.TechnicalInspectedOn as Technic12_510_0_, shortcycle0_.TechnicalInspectedBy as Technic13_510_0_, shortcycle0_.ServiceFound as Service14_510_0_, shortcycle0_.ServiceLeft as Service15_510_0_, shortcycle0_.OperatedPointOfControl as Operate16_510_0_, shortcycle0_.AdditionalInformation as Additio17_510_0_, shortcycle0_.CurbBoxMeasurementDescription as CurbBox18_510_0_, shortcycle0_.Safety as Safety510_0_, shortcycle0_.HeatType as HeatType510_0_, shortcycle0_.MeterPositionLocation as MeterPo21_510_0_, shortcycle0_.MeterDirectionalLocation as MeterDi22_510_0_, shortcycle0_.MeterSupplementalLocation as MeterSu23_510_0_, shortcycle0_.ReadingDevicePositionalLocation as Reading24_510_0_, shortcycle0_.ReadingDeviceSupplementalLocation as Reading25_510_0_, shortcycle0_.ReadingDeviceDirectionalLocation as Reading26_510_0_, shortcycle0_.FSRId as FSRId510_0_, shortcycle0_.SerialNumber as SerialN28_510_0_, shortcycle0_.ManufacturerSerialNumber as Manufac29_510_0_, shortcycle0_.MeterSerialNumber as MeterSe30_510_0_, shortcycle0_.DeviceCategory as DeviceC31_510_0_, shortcycle0_.ActionFlag as ActionFlag510_0_, shortcycle0_.Installation as Install33_510_0_, shortcycle0_.ActivityReason as Activit34_510_0_, shortcycle0_.OldMeterSerialNumber as OldMete35_510_0_, shortcycle0_.QualityIssue as Quality36_510_0_, shortcycle0_.ReceivedAt as ReceivedAt510_0_, shortcycle0_.ShortCycleWorkOrderId as ShortCy38_510_0_, cast(shortcycle0_.WorkOrderNumber as varchar(12)) as formula90_0_, (CASE WHEN (CHARINDEX('SUCCESS', UPPER(cast(shortcycle0_.SAPErrorCode as varchar(8000)))) > 0) THEN 0 ELSE 1 END) as formula91_0_, (CASE WHEN (CHARINDEX('SUCCESS', UPPER(cast(shortcycle0_.ActiveMQStatus as varchar(8000)))) > 0) THEN 0 ELSE 1 END) as formula92_0_, (CASE WHEN (NOT TRIM(shortcycle0_.Installation) GLOB '*[^0-9]*') AND TRIM(shortcycle0_.Installation) like '_%' THEN CAST(TRIM(shortcycle0_.Installation) AS shortcycle0_.BIGINT) ELSE null END) as formula93_0_ FROM ShortCycleWorkOrderCompletions shortcycle0_ WHERE shortcycle0_.Id=?] ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database
near ".": syntax error
at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain)
at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
--- End of inner exception stack trace ---
at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
at NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
at NHibernate.Impl.SessionImpl.Get[T](Object id)
at MMSINC.Data.NHibernate.SessionWrapper.Get[T](Object id) in C:\Solutions\mmsinc\MMSINC.Core\Data\NHibernate\SessionWrapper.cs:line 511
at MMSINC.Data.NHibernate.RepositoryBase`1.Find(Int32 id) in C:\Solutions\mmsinc\MMSINC.Core\Data\NHibernate\RepositoryBase.cs:line 104
at MMSINC.Utilities.ActionHelper`4.DoEditWithArgs[TModel](Int32 id, ActionHelperDoEditArgs args, Action`1 onModelFound) in C:\Solutions\mmsinc\MMSINC.Core.Mvc\Utilities\ActionHelper.cs:line 560
at MapCallMVC.Areas.ShortCycle.Controllers.ShortCycleWorkOrderCompletionController.Edit(Int32 id) in C:\Solutions\mapcall_mvc\MapCallMVC\Areas\ShortCycle\Controllers\ShortCycleWorkOrderCompletionController.cs:line 107
at MapCallMVC.Tests.Controllers.ShortCycleWorkOrderCompletionControllerTest.TestEdit404sIfShortCycleWorkOrderCompletionNotFound() in C:\Solutions\mapcall_mvc\MapCallMVC.Tests\Areas\ShortCycle\Controllers\ShortCycleWorkOrderCompletionControllerTest.cs:line 165
Almost the same answer :
CASE
WHEN
(NOT TRIM(Installation) GLOB '*[^0-9]*') AND TRIM(Installation) like '_%'
THEN CAST(TRIM(Installation) AS BIGINT)
END AS intInstallation
Explanation :
[^0-9] = every character that's not a number
With the NOT you get all the installation who doesn't have a character that's not a number
'_%' wildcard : _ any character once and % 0 or more of any character.
Since your edit, I look at the query :
THEN CAST(TRIM(shortcycle0_.Installation) AS shortcycle0_.BIGINT)
Replace it with :
THEN CAST(TRIM(shortcycle0_.Installation) AS BIGINT)
Use the below condition, which checks the existence of non numerical characters and the length of the trimmed value of Installation:
CASE
WHEN
(NOT TRIM(Installation) GLOB '*[^0-9]*') AND (LENGTH(TRIM(Installation)) > 0)
THEN CAST(TRIM(Installation) AS BIGINT)
END
Note that the data type BIGINT in SQLite, is actually INTEGER (1-8 bytes signed integer).

NHibernate - HQL "join fetch" with SetMaxResults throws error

I'm trying to run the simplest query:
string queryStr = "select b " +
"from Blog b " +
"left outer join fetch b.BlogComments bc";
IList<Blog> blogs = Session.CreateQuery(queryStr)
.SetMaxResults(10)
.List<Blog>();
But it throws the following error:
System.ArgumentNullException: Value cannot be null.
Parameter name: source
However, if I remove the 'fetch' from the HQL it works fine. Also if I leave fetch in but remove SetMaxResults it also works fine. It's something to do with the fetch + SetMaxResults combination.
I'm trying to eager load child collections to optimise the query and prevent SELECT N+1 problems. I'm using NHibernate 3.3.1.4000 with a MySQL database.
My mapping:
public class BlogMap : ClassMapping<Blog>
{
public BlogMap ()
{
// other properties (snip)....
Set(x => x.BlogComments, x =>
{
x.Inverse(true);
x.Cascade(Cascade.All | Cascade.DeleteOrphans);
x.Lazy(CollectionLazy.Extra);
x.Key(k => { k.Column("BlogId"); });
}, x => x.OneToMany());
}
}
public class BlogCommentMap : ClassMapping<BlogComment>
{
public BlogCommentMap ()
{
// other properties (snip)....
ManyToOne(x => x.Blog, x =>
{
x.Column("BlogId");
x.NotNullable(true);
});
}
}
Stacktrace as requested:
[ArgumentNullException: Value cannot be null.
Parameter name: source]
System.Linq.Enumerable.ToList(IEnumerable`1 source) +4206743
NHibernate.Engine.QueryParameters.CreateCopyUsing(RowSelection selection) +178
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) +210
NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) +369
NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) +301
[GenericADOException: Could not execute query[SQL: SQL not available]]
NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) +351
NHibernate.Impl.SessionImpl.List(String query, QueryParameters parameters) +282
NHibernate.Impl.QueryImpl.List() +162
WebApp.Repositories.BlogRepository.SearchBlogs(SearchBlogs search) in C:\...path...\BlogRepository.cs:43
WebApp.Controllers.HomepageController.Index(Int32 page) in C:\...path...\Controllers\HomepageController.cs:54
lambda_method(Closure , ControllerBase , Object[] ) +101
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970061
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
What you are experiencing is a bug... But in this case it could be a good sign! ;) Because paging (SetFirstResult(), SetMaxResults()) on a query fetching parent and its collection will be returning unexpected results. Let's say, that
DB tables contain this:
BlogA
BlogCommentA1
BlogCommentA2
BlogCommentA3
BlogB
BlogCommentB1
BlogCommentB2
QueryOver syntax (which is working) doing the same as the above HQL:
var blogs = session.QueryOver<Blog>()
.Fetch(c => c.BlogComment).Eager // collection in one SQL
.Skip(0).Take(2) // paging, but weird...
.List<Blog>();
.Skip(0).Take(2) - first page, a select resulting in this two rows but ONE BlogA:
| BlogA | BlogCommentA1
| BlogA | BlogCommentA2
.Skip(2).Take(2) - next page, weird... again BlogA
| BlogA | BlogCommentA3
| BlogB | BlogCommentB1
And this is most likely not we want.
Suggestion: go for SELECT 1+1
The most reliable in this case is doing the paging only on the parent object (Blog). And then, when we have in NHibernate session all the blogs (.Skip(2).Take(2)) we will only once call select for all their children (BlogComments).
The easiest way is set the batch-size="x", where x is a number close to the usual page size (e.g. 25 or 50).
.BatchSize(25)
NHibernate documentation 19.1.5. Using batch fetching explains details
This looks like a bug either in QueryParameters.CreateCopyUsing(), or something else is not creating the original QueryParameters correctly. Anyway, using SetMaxResults() with collection joins will force the paging to be applied client side, not in the database, which may not be what you want.
You propably want to rewrite that to use a IN on a subquery that yields 10 blog id and have the join fetching in the outer query.

LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

NHibernate version 3.3.1.4000
Query:
IQueryable<Activity> activities = _repository.GetList<Activity>();
IQueryable<ActivityStatistic> statistics = activities
.GroupBy(activity => activity.ActivityLicense.SerialNumber)
.Select(grouping => new ActivityStatistic
{
ActivityCount = grouping.Count(),
LicenseCode = grouping.Key
})
.OrderBy(stat => stat.LicenseCode);
List<ActivityStatistic> result = statistics
.Skip(request.StartIndex)
.Take(request.Count)
.ToList();
If I comment Skip/Take code, it works properly. How can I make it to work together without calling ToList() after OrderBy using LINQ to NHibernate?
Thanks in advance.
Update:
Exception:
The method or operation is not implemented.
at NHibernate.Linq.GroupBy.AggregatingGroupByRewriter.FlattenSubQuery(SubQueryExpression subQueryExpression, QueryModel queryModel)
at NHibernate.Linq.GroupBy.AggregatingGroupByRewriter.ReWrite(QueryModel queryModel)
at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at MBP.AuthorizationService.Logic.LicenseService.GetActivityStatistic(CommonRequest request, Int32& recordsCount) in D:\Projects\MBP.Launcher\MBP.AuthorizationService.Logic\LicenseService.cs:line 201
Michael Petito answered to the question:
This is a known issue that I just ran into as well:
nhibernate.jira.com/browse/NH-2566 – Michael Petito Aug 22 at 19:56
Waiting for new releases...

LINQ to SQL delete producing "Specified cast is not valid" error

I've got a painfully simple table that is giving me a "Specified cast is not valid" error when I try to delete one or more rows. The table has two columns, an "id" as the primary key (INT), and a "name" (VARCHAR(20)), which maps to a String in the LINQ to SQL dbml file. Both of these statements produce the error:
dc.DeleteOnSubmit(dc.MyTables.Where(Function(x) x.id = 1).SingleOrDefault)
dc.DeleteAllOnSubmit(dc.MyTables)
I iterated through "MyTable" just to make sure there was no weird data, and there are only two rows:
id = 1, name = "first"
id = 2, name = "second"
The exception is happening on SubmitChanges. Here is the stack trace:
[InvalidCastException: Specified cast is not valid.]
System.Data.Linq.SingleKeyManager`2.TryCreateKeyFromValues(Object[] values, V& v) +59
System.Data.Linq.IdentityCache`2.Find(Object[] keyValues) +28
System.Data.Linq.StandardIdentityManager.Find(MetaType type, Object[] keyValues) +23
System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues) +48
System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance) +142
System.Data.Linq.ChangeProcessor.BuildEdgeMaps() +233
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +59
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +331
System.Data.Linq.DataContext.SubmitChanges() +19
InpatientCensus.MaintenanceController.DeleteSoleCommunity(Int32 id) in C:\Documents and Settings\gregf\My Documents\Projects\InpatientCensus\InpatientCensus\Controllers\MaintenanceController.vb:14
lambda_method(ExecutionScope , ControllerBase , Object[] ) +128
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
System.Web.Mvc.Controller.ExecuteCore() +126
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Removing the association added to the DBML file allows rows to be deleted. Why would the association be causing the error? The associated columns are both VARCHAR(20) in the database and resolve to Strings in the DBML file.
What could possibly be causing a casting error?
Okay, upon seeing the update, the issue is the association between your two tables. This is a known bug in .NET 3.5 SP1 and will be fixed in .NET 4.0. Try your code on a .NET 4.0 Beta if you can.
We had a similar problem, caused by using non-integer keys. Details and hotfix number are here: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358
Try:
dc.MyTables.DeleteOnSubmit(dc.MyTables.SingleOrDefault(x=>x.id==1));
dc.MyTables.DeleteAllOnSubmit(dc.MyTables);