Исключение Antlr с сообщением "план b" при ходьбе IQueryable объектов NHibernate
У меня довольно странное исключение, когда я пытаюсь материализовать IQueryable
, я получил форму NHibernate.Linq
. Исключение типа Antlr.Runtime.Tree.RewriteEmptyStreamException
просто указывает plan b
и ничего больше. Подробное исключение можно найти на http://pastebin.com/kR2dvDHd
Здесь код, который выдает исключение:
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
Класс Matter Extractor так же прост, как 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>
- это класс утилиты, который реализует IQueryable с помощью методов расширения NHibernate.Linq
до NHibernate.Session
. Здесь нет ничего конкретного, но на всякий случай здесь перечислены: http://pastebin.com/MgDxDg3Y
Я не думаю, что это связано с сопоставлениями NHibernate, так как другие тесты, которые взаимодействуют с объектом Matter
, выполняются просто отлично. Скорее всего, это связано с предложением Where
, но я не могу понять, что происходит с этим предложением. Я попытался заменить
OrderByDescending(msh => msh.CreateTime).FirstOrDefault()
к
OrderBy(msh => msh.CreateTime).LastOrDefault()
но он просто сказал мне The LastResultOperator result operator is not current supported
, поэтому я думаю, что NHibernate.Linq
просто не может оставаться LastOrDefault
.
Любые идеи, что означает plan b
, и как это можно обойти?
Ответы
Ответ 1
Вы уверены, что
OrderByDescending (msh = > msh.CreateTime).FirstOrDefault()
Не возвращает null для любых элементов в вашем репозитории? Мне кажется, этот бит кода мне нужен.
(... OrderByDescending (msh = > msh.CreateTime).FirstOrDefault()?? someDummyStatusNotSatisfyingClause)
Можете решить вашу проблему.
Другая возможность заключается в том, что вы не указали NHibernate, как и когда материализовать истории состояний в определении сущности. Мой опыт работы с NHibernate заключается в том, что некоторые запросы, подобные попыткам, могут быть лучше подобраны как функция репозитория (хранимая процедура)