I have a simple query like below:
var employeeTeam = Session.Query<EmployeeTeam>()
.Where(x => x.StartEffective <= competency.FinalDate && // competency.FinalDate is a DateTime
employeesIds.Contains(x.EmployeeId)) // employeeIds is a List<long>
.OrderByDescending(x => x.StartEffective)
.Select(x => new
{
x.EmployeeId,
x.StartEffective,
x.Team
}).ToList();
It successfully runs once, but when executed in the second time(or third, fourth and so son) it throws an invalid cast exception like:
Fatal Error:System.InvalidCastException: Cannot convert type 'System.Linq.EnumerableQuery`1[<>f__AnonymousType0`3[System.Int64,System.DateTime,Team]]' to 'System.Collections.Generic.IEnumerable`1[<>f__AnonymousType0`3[System.Int64,System.DateTime,Team]]'. in NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
Rest of the stack trace supressed for bravety.
The query is always executed in database before the error. It returns no records, but its is ok. If I rebuild the solution and run again, the query is executed in first time again, and then start throwing the exception each other time I run it. Other queries runs everytime w/o any problems. I have no idea of what causes the error.
Its important to say that this code is running in an CSharpCodeProvider environment, but I don't know if it can make a difference.
UPDATE
It happens even with the most simple form of the query:
var employeeTeam = Session.Query<EmployeeTeam>()
.Select(x => new
{
x.Id
}).ToList();
It runs ok for the first time only. But if I change the annon object from { x.Id }
to { x.TeamId }
, for example, it runs ok in the first time, then the exceptions occurs again.
UPDATE 2
I just realize that if I add the following property to the annon object, the query works everytime:
Rnd = (new Random().Next(1, 999))
So, a cache issue maybe?
UPDATE 3
I updated the NHibernate from 3.3
to 4.0.0.4
and it solves almost all problems except by one query:
var query = session.Query<Holiday>()
.Select(x => new {
HoliDayCities = x.City.Select(c => c.Id).ToList(),
HoliDayStates = x.State.Select(s => s.Id).ToList(),
Date = new DateTime((int)(x.Year.HasValue ? x.Year : competencia.InitialDate.Year), (int)x.Month, (int)x.Day)
}).ToList();
Error message:
GenericADOException: The value "{ HoliDayCities = System.Collections.Generic.List`1[System.Int64], HoliDayStates = System.Collections.Generic.List`1[System.Int64], Date = 01/02/2015 00:00:00 }" is not "<>f__AnonymousType1`3[System.Collections.Generic.List`1[System.Int64],System.Collections.Generic.List`1[System.Int64],System.DateTime]" and cannot be used on this collection. Parameter name: value
If I add the Rnd()
function on Select
scope as I mentioned before, it works fine. The problem occurres only with anonymous object.
It looks like it is an issue with manipulating anonymous types and NHibernate. I would highly suggest returning a simple resultset, materializing the resultset with ToList(), and then doing projections on that resultset.
var employeeTeam = Session.Query<EmployeeTeam>()
.Select(x => x)
.Where(x => x.Id != 0)
.ToList();
var projectedTeam = employeeTeam.Select(x => new {x.Id});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With