2012-07-16 12 views
11

Tengo una excepción bastante extraña cuando intento materializar el IQueryable Recibí el formulario NHibernate.Linq. La excepción del tipo Antlr.Runtime.Tree.RewriteEmptyStreamException solo dice plan b, y nada más. excepción detallada se puede encontrar en http://pastebin.com/kR2dvDHdExcepción de Antlr con el mensaje "plan b" al caminar IQueryable de las entidades de NHibernate

Aquí está el código que genera una excepción:

var matterExtractor = new MatterExtractor(); 
var InactiveMatters = matterExtractor.GetMattersAtStatus(General.InactiveMatterStatus); 
Assert.IsNotNull(InactiveMatters); //OK 
Assert.IsInstanceOfType(InactiveMatters, typeof (IQueryable<Matter>)); // OK 
var MaterializedMatters = InactiveMatters.ToList(); //Exception is thrown 
clase

Materia Extractor es tan simple como siguientes;

public class MatterExtractor 
{ 
    public virtual IQueryable<Matter> GetMattersAtStatus(MatterStatus status) 
    { 
     return 
      (new NHibernateRepository.Repository<Matter>()).Where(
       m => m.MatterStatusHistories.OrderByDescending(msh => msh.CreateTime).FirstOrDefault().MatterStatus == status); 
    } 
} 

NHibernateRepository.Repository<T> es una clase de utilidad que implementa IQueryable a través de NHibernate.LINQ métodos de extensión a NHibernate.Session. Nada específico aquí, pero por si acaso, aquí está la lista: http://pastebin.com/MgDxDg3Y

No creo que está relacionado con las asignaciones de NHibernate, ya que otras pruebas que interactúan con Matter entidad de ejecución muy bien. Lo más probable es que esté relacionado con la cláusula Where, pero no puedo entender qué está pasando con esa cláusula. He intentado reemplazar

OrderByDescending(msh => msh.CreateTime).FirstOrDefault() 

a

OrderBy(msh => msh.CreateTime).LastOrDefault() 

pero simplemente me dijeron The LastResultOperator result operator is not current supported, así que creo NHibernate.Linq simplemente no puede permanecer LastOrDefault.

¿Qué significa plan b y cómo puedo solucionarlo?

+3

Podría reproducir tu problema, por lo que diría que es un error en NHibernate, o bien debería generar la consulta o debería arrojar una excepción no admitida. Debe enviar un informe de error. Como solución, puede evaluar toda su consulta en el lado del cliente o reorganizar su consulta para comenzar con 'Repository ' ... – nemesv

Respuesta

1

¿Estás seguro de que OrderByDescending (msh => msh.CreateTime) .FirstOrDefault()

¿No regresando nula para cualquier elemento en su repositorio? Ese bit de código me parece ser el tema en cuestión.

(... OrderByDescending (msh => msh.CreateTime) .FirstOrDefault() ?? someDummyStatusNotSatisfyingClause)

podría resolver su problema.

Otra posibilidad es que no haya instruido a NHibernate sobre cómo y cuándo materializar los historiales de estado en la definición de la entidad. Mi experiencia con NHibernate es que una consulta como la que estás intentando podría ser más adecuada como una función de repositorio (un procedimiento almacenado)

+0

La pregunta se formuló hace dos años. Sí, estoy seguro de que 'OrderByDescending (...)' nunca devolvió nulo. Desafortunadamente, ya no tengo acceso a ese código. Además, crear un procedimiento almacenado no era una opción, ya que la aplicación que estaba desarrollando era una adición independiente a un sistema mucho más grande; estaba utilizando la base de datos del sistema principal directamente, por lo que no se me permitió realizar ningún cambio de esquema. – J0HN

Cuestiones relacionadas