4

特定のクエリを他のいくつかの関数で使用できるようにしたいのですが、特定のドメインに特化した QueryOver オブジェクトを作成するだけのクラスがあります。

ただし、その関数はエイリアス オブジェクトを使用して結合を作成します。別の関数からこれらのエイリアスにアクセスするにはどうすればよいですか?

たとえば、それぞれが学生のコレクションを持つ Course エンティティがあるとします。Activeそして、私は常に(ブール値)コースのみを取得したい

public class QueryHelperClass
{
  public QueryOver<Course, Course> GetQuery()
  {
      Address studentAlias = null;
      QueryOver<Course, Course> query = QueryOver.Of<Course>(() => courseAlias)
       .JoinAlias(x => cus.Student, () => studentAlias)
       .Where(x => courseAlias.IsActive);
      return query;
  }
}

GetExecutableQuery を実行して結果を返すだけであれば問題なく動作しますが、アクセスしてクエリを変更する必要がある場合はどうすればよいstudentAliasでしょうか。

例:

public class SomeOtherClass
{
  public List<Course> GetActiveCourseSummary(QueryOver<Course, Course> queryOver)
  {
      var query = queryOver.Where(a=> studentAlias.Name = "Bob");
      ...
  }
}

から、SomeOtherClass.GetActiveCourseSummary「ボブ」が登録されているコースのみを取得するようにクエリを変更したいと考えています。しかし、別の関数で定義されているため、studentAlias にアクセスできません。

ここで何ができますか、またはこれをすべて完全にハードコアに間違って設定していますか?

4

1 に答える 1

2

実際、 で同じ変数を再宣言SomeOtherClassできます。

public List<Course> GetActiveCourseSummary(QueryOver<Course, Course> queryOver)
{
    Address studentAlias = null;
    var query = queryOver.Where(() => studentAlias.Name == "Bob");
    ...
}

ポイントは、studentAlias(ローカル変数Addressの)名前がメソッドと同じであることGetQuery()です。

.Where()メソッドで渡すのはExpression. これは解析され、その文字列部分"studentAlias"は以前と同じようにGetQuery()で使用されます。

しかし

これは私が使用する方法ではないと言えます。に何が渡されるSomeOtherClassのか、クエリがどのように構築されたのかは明確ではありません。すでにエイリアスが存在する可能性がありますが、単純なQueryOver<Course, Course> queryOver.

私のアプローチは、別の方法で行うことです。すべての制限を下まで集めます。たとえば、一連の制限がある場合はIList<ICriterion>、DAO メソッドを呼び出し、クエリを作成して、これらの制限を 1 か所に追加します。しかし、それは別の話です

SomeOtherClassにさらにチェックを入れたい場合は、Criteria API を使用できます。欠点は、プロパティ "Student" と "Code" の文字列表現を使用する必要があることです ( QueryOver APIほどきれいではありません) 。

public List<Course> GetActiveCourseSummary(QueryOver<Course, Course> queryOver)
{
    var criteria = query.UnderlyingCriteria;
    var rootAlias = criteria.Alias;              // will return "courseAlias"
    var path = rootAlias + ".Student";           // the path
    var student = criteria.GetCriteriaByPath(path)
            ?? criteria.CreateCriteria(path, path);
    var studentAlias = student.Alias;            // finally we do have existing alias
    queryOver.And(Restrictions.Eq(studentAlias + ".Name ", "Bob"));
    ...
于 2013-06-01T14:37:27.430 に答える