c# linq nhibernate csharpcodeprovider

c# - La consulta NHibernate se ejecuta solo una vez, luego lanza la excepción InvalidCastException



linq csharpcodeprovider (2)

Tengo una consulta simple como a continuación:

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();

Se ejecuta con éxito una vez, pero cuando se ejecuta en la segunda vez (o la tercera, la cuarta y, por lo tanto, el hijo) lanza una excepción de conversión no válida como:

Error grave: System.InvalidCastException: No se puede convertir el tipo ''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]] ''. en NHibernate.Linq.DefaultQueryProvider.Execute [TResult] (expresión de expresión)

Resto del rastro de pila suprimido por valentía.

La consulta siempre se ejecuta en la base de datos antes del error. No devuelve registros, pero está bien. Si reconstruyo la solución y la ejecuto de nuevo, la consulta se ejecuta nuevamente la primera vez, y luego empiezo a lanzar la excepción cada vez que la ejecuto. Otras consultas se ejecutan cada vez sin ningún problema. No tengo idea de qué causa el error.

Es importante decir que este código se está ejecutando en un entorno CSharpCodeProvider , pero no sé si puede hacer una diferencia.

ACTUALIZAR

Ocurre incluso con la forma más simple de la consulta:

var employeeTeam = Session.Query<EmployeeTeam>() .Select(x => new { x.Id }).ToList();

Se ejecuta bien por primera vez solamente. Pero si cambio el objeto annon de { x.Id } a { x.TeamId } , por ejemplo, se ejecuta correctamente la primera vez, entonces las excepciones vuelven a ocurrir.

ACTUALIZACIÓN 2

Acabo de darme cuenta de que si agrego la siguiente propiedad al objeto annon, la consulta funciona siempre:

Rnd = (new Random().Next(1, 999))

Entonces, ¿un problema de caché tal vez?

ACTUALIZACIÓN 3

4.0.0.4 el NHibernate de 3.3 a 4.0.0.4 y resuelve casi todos los problemas excepto por una consulta:

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();

Mensaje de error:

GenericADOException: el valor "{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] "y no puede ser utilizado en esta colección. Nombre del parámetro: valor

Si agrego la función Rnd() en el alcance de selección como mencioné anteriormente, funciona bien. El problema ocurre solo con el objeto anónimo.


No creo que el proveedor Nhib LINQ admita que la proyección forme parte de la ejecución diferida. Creo que necesitas poner tu proyección después de ToList ()

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) .ToList() .Select(x => new { x.EmployeeId, x.StartEffective, x.Team });


Parece que es un problema con la manipulación de tipos anónimos y NHibernate. Recomendaría encarecidamente devolver un conjunto de resultados simple, materializar el conjunto de resultados con ToList () y luego hacer proyecciones en ese conjunto de resultados.

var employeeTeam = Session.Query<EmployeeTeam>() .Select(x => x) .Where(x => x.Id != 0) .ToList(); var projectedTeam = employeeTeam.Select(x => new {x.Id});