2

私はNHibernateを初めて使用し、これら2つのステートメントが異なるSQLを生成する理由を理解できません。

最初のものClientInformationは、私が欲しいものである(情報とクライアントがプロキシである)だけを取得します。

return repository
            .CreateQuery("from ClientInformation ci where ci.Information.IsMandatory = true and ci.Client.Id = :clientId")
            .SetParameter("clientId", clientId)
            .List<ClientInformation>();

2 番目のものはすべてを生成します。3 つのエンティティのすべてのデータが返されますが、これは私が望むものではありません

return repository.CreateCriteria()
            .CreateAlias("Information", "inf")
            .CreateAlias("Client", "cli")
            .Add(Expression.Eq("cli.Id", clientId))
            .Add(Expression.Eq("inf.IsMandatory", true))
            .List<ClientInformation>();

私は何を間違っていますか?ありがとう

4

1 に答える 1

2

実際、それはすべてあなたがやりたいことに要約されます。まず第一に、Criteriaクエリはマッピング定義(レイジー/イーガー結合など)を尊重しますが、対照的にHQLクエリでは、特に定義されていない限り、すべてがレイジーです(もちろん値プロパティを除く)

次に、CreateAliasメソッドは、参加するエンティティを定義し、デフォルトの動作では、それらも選択します。

あなたが呼んでいることに注意してください

repository.CreateCriteria()

そして、それがnhSession.CreateCriteria()に直接ラップされる場合は、選択したいものを正確に定義していません。だから、これを作ってみてください

nhSession.CreateCriteria(typeof(ClientInformation));

これは「ClientInformationのみを選択」と翻訳されます。

于 2010-06-04T09:06:27.947 に答える