nhibernate:クエリまたはオペレーター
-
02-10-2019 - |
質問
私は、テーブルのあるフィールドと結合されたテーブルの別のフィールドで特定の値を探すために、クエリにオペレーターを構築する方法を探しています。これはSQLではかなり基本的なものですが、私は世界のために、Nhibernateでこれを行う方法を理解することはできません。私はWebを検索していますが、私が見つけた例は私にとってかなり曖昧であり、特定の実装に適用するのは難しいと感じています。
パーティーと呼ばれるクラスがあり、参照と呼ばれる文字列フィールドがあります。これはメインリファレンスです。新しい要件には、当事者への多くの副参照を追加することもできるオプションが要求されました。そのため、パーティーと多くの関係を持つPartyReferenceと呼ばれる別のクラスを追加する必要がありました。
現在、特定の参照を使用して、この主要な参照フィールドとサイド参照の両方でその価値を調べる必要があります。しかし、このフィールドが値に対応している必要があるか、他の1つに対応している必要があるとNhibernateに言うことができない限り、私はそれを機能させることができません。
私はこのように見える回避策を作成しましたが、「または」と言う方法が必要なので、それは不可解で愚かです。
public Party GetPartyOnAnyReference(string reference)
{
Party party;
ISession session = Factory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
//first search on main reference
ICriteria criteria1 = session.CreateCriteria(typeof(Party));
criteria1.Add(Restrictions.Eq("Reference", reference));
IList<Party> parties1 = criteria1.List<Party>();
party = parties1.Count > 0 ? parties1[0] : null;
//then try with side-references
if (party == null)
{
ICriteria criteria2 = session.CreateCriteria(typeof(Party));
criteria2
.SetFetchMode("References", FetchMode.Eager)
.CreateCriteria("References")
.Add(Expression.Eq("Reference", reference));
IList<Party> parties2 = criteria2.List<Party>();
party = parties2.Count > 0 ? parties2[0] : null;
}
session.Close();
}
catch (Exception e)
{
tx.Rollback();
session.Close();
if (e.GetType().ToString() == "NHibernate.ObjectNotFoundException")
party = null;
else throw;
}
return party;
}
もちろん、パーティークラスからメイン参照をすべて削除し、他の参照と同等に扱います。しかし、ある段階では、とにかくnhibernateでクエリを使用する必要があるので、この特定のケースでこれを解決することもできます。
何か案は?
解決
使用できます Restrictions.Or
または、複数のORの分離を使用します。
session.CreateCriteria<Party>()
.CreateAlias("References", "r", JoinType.LeftOuterJoin)
.Add(Restrictions.Or(
Restrictions.Eq("Reference", reference),
Restrictions.Eq("r.Reference", reference)))
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Party>();
所属していません StackOverflow