1

私はそのようなクライアントクラスを持っています:

public class Client
{
    public Person Pers { get; set; }
}

そして、私は2人の子クラスを持っています:

public class PersonType1 : Person 
{
   protected string att1;
   protected string att2;
}

public class PersonType2 : Person 
{
     protected string att3;
     protected string att4;
}

public class Person 
{
     protected string attx;
     protected string atty;
}

したがって、私のクライアントは PersonType1 または PersonType2 である可能性があります...

クライアント検索を実行する必要があります...その検索のパラメーターはatt1、att2、att3、att4、attx、attyです...しかし、これらはすべてオプションです...

ICriteria でその検索を実行しようとしていますが、その継承スキームを指定する方法がわかりません...

4

1 に答える 1

1

基準レベルでは、Person クラスはどの派生クラスにも依存しないため、実際にはこれを行うことはできません。IList<Person>コレクションを繰り返し処理すると、要素が PersonType1 および PersonType2 タイプで構成されることも示されますが、結果セットは になります (制限なしで DB からセット全体をフェッチすると仮定します)。

とはいえ、次の回避策で目的の効果を得ることができます: 各派生型を新しいサブクエリとして定義します。

var dc1 = DetachedCriteria.For(typeof(PersonType1)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att1", "foo"));

var dc2 = DetachedCriteria.For(typeof(PersonType2)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att3", "bar"));

N 派生型の場合、メインの Criteria クエリで行うだけです

CreateCriteria(typeof(Person)).Add(Subqueries.PropertyIn("Id", dc1) || Subqueries.PropertyIn("Id", dc2));

あるいは、ISQLQuery にはそのような制限はありません。

編集 クライアントを見つけるために必要な調整を下に追加しています。基準を基準に書き直し<Client>、結合された のサブクエリ制限を表現し<Person>sます。

var crit = ses.CreateCriteria(typeof(Client)).CreateCriteria("Person","per").Add(Subqueries.PropertyIn("per.Id", dc1) || Subqueries.PropertyIn("per.Id", dc2));
于 2009-11-06T14:28:39.873 に答える