Исключение 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 заключается в том, что некоторые запросы, подобные попыткам, могут быть лучше подобраны как функция репозитория (хранимая процедура)