2012-07-16 7 views
11

Mam dość dziwny wyjątek, gdy próbuję zmaterializować IQueryable Mam formularz NHibernate.Linq. Wyjątek typu Antlr.Runtime.Tree.RewriteEmptyStreamException po prostu stwierdza plan b i nic więcej. Szczegółowy wyjątek znajduje się w http://pastebin.com/kR2dvDHdWyjątek Antlr z komunikatem "plan b" podczas chodzenia IQueryable jednostek NHibernate

tutaj kod, który zgłasza wyjątek:

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 
klasy

Materia wyciągowy jest proste następujących urządzeń:

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> jest klasą narzędzie, które realizuje IQueryable metodami rozszerzenia NHibernate.LINQ do NHibernate.Session. Nic konkretnego tutaj, ale na wszelki wypadek, oto listing: http://pastebin.com/MgDxDg3Y

Nie sądzę, że jest to związane z odwzorowaniami NHibernate, ponieważ inne testy, które wchodzą w interakcję z jednostką Matter, działają dobrze. Najprawdopodobniej jest to związane z klauzulą ​​Where, ale nie mogę zrozumieć, co dzieje się z tą klauzulą. Próbowałem zastępując

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

do

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

ale po prostu powiedział mi The LastResultOperator result operator is not current supported, więc myślę NHibernate.Linq prostu nie może pozostać LastOrDefault.

Wszelkie pomysły, co znaczy plan b i jak mogę to obejść?

+3

Mogę zaimportować twój problem, więc powiedziałbym, że to błąd w NHibernate, albo powinien wygenerować zapytanie lub powinien wyrzucić nieobsługiwany wyjątek. Powinieneś przesłać raport o błędzie. Aby obejść ten problem, możesz ocenić całe zapytanie po stronie klienta lub zreorganizować zapytanie, zaczynając od 'Repository ' ... – nemesv

Odpowiedz

1

Czy jesteś pewien, że OrderByDescending (msh => msh.CreateTime) .FirstOrDefault()

Czy nie wraca null dla dowolnych elementów w repozytorium? Ten kawałek kodu wydaje mi się tym właśnie problemem.

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

Might rozwiązać problem.

Inną możliwością jest, że nie poinformował NHibernate, jak i kiedy materialia historie stanów w definicji obiektu. Moje doświadczenie z NHibernate polega na tym, że niektóre zapytania, które próbujesz, mogą być lepiej dopasowane do funkcji repozytorium (procedura przechowywana).

+0

Pytanie zadano dwa lata temu. Tak, jestem pewien, że 'OrderByDescending (...)' nigdy nie zwrócił wartości null. Niestety, nie mam już dostępu do tego kodu. Ponadto tworzenie procedury przechowywanej nie było możliwe, ponieważ aplikacja, którą rozwijałem, była samodzielnym dodatkiem do znacznie większego systemu; korzystał bezpośrednio z głównej bazy danych systemu, więc nie mogłem wprowadzać żadnych zmian w schemacie. – J0HN

Powiązane problemy