我在尝试实现 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 类很简单,如下所示:
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
的扩展方法.这里没有什么特别的,但为了以防万一,这是 list :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
这意味着我该如何解决?
最佳答案
你确定 OrderByDescending(msh => msh.CreateTime).FirstOrDefault()
没有为您存储库中的任何元素返回 null 吗?在我看来,那段代码是有问题的。
(...OrderByDescending(msh => msh.CreateTime).FirstOrDefault() ?? someDummyStatusNotSatisfyingClause)
可能会解决您的问题。
另一种可能性是您没有指示 NHibernate 如何/何时具体化实体定义中的状态历史记录。我对 NHibernate 的经验是,像您尝试的某些查询可能更适合作为存储库函数(存储过程)
关于c# - 遍历 NHibernate 实体的 IQueryable 时出现消息 "plan b"的 Antlr 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509283/