2012-07-16 5 views
11

Ho un'eccezione piuttosto strana quando provo a materializzare lo IQueryable Ho ottenuto il modulo NHibernate.Linq. L'eccezione del tipo Antlr.Runtime.Tree.RewriteEmptyStreamException indica solo plan b e nient'altro. eccezione dettagliate sono disponibili all'indirizzo http://pastebin.com/kR2dvDHdEccezione di antlr con messaggio "piano b" quando si cammina IQueryable di entità NHibernate

Ecco il codice che genera un'eccezione:

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 
classe

materia Extractor è semplice come follwing:

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> è una classe di utilità che implementa IQueryable tramite i metodi di estensione NHibernate.LINQ a NHibernate.Session. Nulla di specifico qui, ma nel caso, ecco la lista: http://pastebin.com/MgDxDg3Y

Non penso sia correlato ai mapping di NHibernate, poiché altri test che interagiscono con l'entità Matter funzionano correttamente. Molto probabilmente è correlato alla clausola Where, ma non riesco a capire cosa c'è di sbagliato in quella clausola. Ho provato a sostituire

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

a

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

ma appena mi ha detto The LastResultOperator result operator is not current supported, quindi penso che NHibernate.Linq proprio non può rimanere LastOrDefault.

Qualche idea di cosa significa plan b e come posso risolvere il problema?

+3

Potrei riproffare il tuo problema quindi direi che questo è un bug in NHibernate, o dovrebbe generare la query oppure dovrebbe generare un'eccezione non supportata. Dovresti inviare una segnalazione di bug. Come soluzione alternativa puoi valutare l'intera query sul lato client o riorganizzare la query per iniziare con 'Repository ' ... – nemesv

risposta

1

Sei certo che OrderByDescending (MSH => msh.CreateTime) .FirstOrDefault()

Non è forse tornando nullo per tutti gli elementi nella vostra repository? Quel pezzetto di codice mi sembra il bit in questione.

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

potrebbe risolvere il problema.

Un'altra possibilità è che non è stato istruito NHibernate come/quando materializzare le cronologie di stato nella definizione dell'entità. La mia esperienza con NHibernate è che alcune query come si sta tentando potrebbero essere più adatte come una funzione di repository (una stored procedure)

+0

La domanda è stata posta due anni fa. Sì, sono sicuro che 'OrderByDescending (...)' non ha mai restituito nulla. Sfortunatamente, non ho più accesso a quel codice. Inoltre, la creazione di una stored procedure non era un'opzione, poiché l'app che stavo sviluppando era un'aggiunta autonoma a un sistema molto più grande; stava usando direttamente il database di sistema principale, quindi non mi è stato permesso di apportare modifiche allo schema. – J0HN

Problemi correlati