步行IQiberyable的NHibernate实体时带有消息"plan b"的Antlr异常

J0H*_*0HN 11 c# linq nhibernate fluent-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
Run Code Online (Sandbox Code Playgroud)

Matter Extractor类就像下面这样简单:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

NHibernateRepository.Repository<T>是一个实用程序类,通过NHibernate.LINQ扩展方法实现IQueryable NHibernate.Session.这里没有具体的,但以防万一,这里是列表:http://pastebin.com/MgDxDg3Y

我不认为它与NHibernate映射有关,因为与Matter实体交互的其他测试运行得很好.很可能它与该Where条款有关,但我无法理解该条款出了什么问题.我试过更换

OrderByDescending(msh => msh.CreateTime).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

OrderBy(msh => msh.CreateTime).LastOrDefault()
Run Code Online (Sandbox Code Playgroud)

但它只是告诉我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 的经验是,像您尝试的某些查询可能更适合作为存储库函数(存储过程)