Calling Obtener en el siguiente código funciona bien:extraña LINQ a nhibernate cuestión, el reparto no válida del 'System.Int32'
public class ContractService : IContractService
{
private readonly IRepository<Contract> repository;
public ContractService(IRepository<Contract> repository)
{
this.repository = repository;
}
public Contract Get(int contractId)
{
return repository.Query().Where(x => x.Id == contractId).FirstOrDefault();
}
pero cuando hago esto:
public class ContractService : CRUDService<Contract>, IContractService
{
public ContractService(IRepository<Contract> repository) : base(repository)
{
}
}
public class CRUDService<TEntity> : ICRUDService<TEntity> where TEntity : IEntity
{
protected readonly IRepository<TEntity> repository;
public CRUDService(IRepository<TEntity> repository)
{
this.repository = repository;
}
public TEntity Get(int id)
{
var entities = this.repository.Query().Where(s => s.Id == id);
return entities.FirstOrDefault();
}
"entidades" dentro de el método get arroja una excepción cuando itera sobre él:
Invalid cast from 'System.Int32' to 'TEntity' (where TEntity is the type name)
¿Alguien tiene alguna idea de por qué?
Editar: esto es lo que las diferentes expresiones se ven como:
En la versión genérica (arriba uno), parece estar tratando de convertir x por alguna razón, que debe ser a causa de los medicamentos genéricos: s
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (Convert(x).Id = value(CRUDService`1+<>c__DisplayClass0[Contract]).Id)).FirstOrDefault()}
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (x.Id = value(ContractService+<>c__DisplayClass2).Id)).FirstOrDefault()}
(espacios de nombres omitidos para mayor claridad)
segunda edición: parece que es cuando se intenta convertir entre IEntity y el tipo de instancia (TEntity)
aquí es IEntity:
public interface IEntity
{
int Id { get; }
}
tercera edición: parece ser el Convert (x) que hace que el AssociationVisitor a no visitar adecuadamente el árbol de expresión y convertir "Convertir (x) .ID"
cuarto Editar: Y ahí vamos, alguien ya encontró el error https://nhibernate.jira.com/browse/NHLQ-11!
Gracias
Andrew
Eso suena muy extraño. ¿Tienes algún registro de qué SQL se está ejecutando? ¿Cómo se ve el resto de la pila? –
Parece que no se ejecuta ningún SQL, parece que el Linq falla antes de llegar a cualquier punto cercano al DB. Acabo de descargar la fuente para una depuración http://sourceforge.net/project/showfiles.php?group_id=216446&package_id=306405&release_id=654054 –
¡También me encontré con este problema! – bleevo