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 的经验是,像您尝试的某些查询可能更适合作为存储库函数(存储过程)
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |