11

尝试实现IQueryableI got form时,我遇到了非常奇怪的异常NHibernate.Linq。type 的例外Antlr.Runtime.Tree.RewriteEmptyStreamException只是 states 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

物质提取器类很简单,如下所示:

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>是一个实用程序类,它通过NHibernate.LINQ扩展方法实现 IQueryable 到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意思,我该如何解决?

4

1 回答 1

1

你确定 OrderByDescending(msh => msh.CreateTime).FirstOrDefault()

没有为存储库中的任何元素返回 null 吗?在我看来,那段代码是有问题的。

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

或许能解决你的问题。

另一种可能性是您没有指示 NHibernate 如何/何时实现实体定义中的状态历史。我对 NHibernate 的经验是,像您尝试的某些查询可能更适合作为存储库函数(存储过程)

于 2014-08-23T15:31:58.770 回答