11

IQueryableI got formを具体化しようとすると、かなり奇妙な例外が発生し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。ここでは特に何もありませんが、念のため、ここにリストがあります:http: //pastebin.com/MgDxDg3Y

Matterエンティティと相互作用する他のテストは問題なく実行されるため、NHibernateマッピングに関連しているとは思いません。おそらくそれは条項に関連してい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)

あなたの問題を解決するかもしれません。

もう 1 つの可能性は、エンティティ定義でステータス履歴を具体化する方法/時期を NHibernate に指示していないことです。NHibernate での私の経験では、あなたが試みているようないくつかのクエリは、リポジトリ関数 (ストアド プロシージャ) としてより適している可能性があります。

于 2014-08-23T15:31:58.770 に答える