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的名称)与 method 中的名称相同GetQuery()

这将起作用,因为我们在.Where()方法中传递的是Expression. 它被解析,其字符串部分"studentAlias"的使用方式与之前相同,在GetQuery()中。

我会说,这不是我会使用的方式。目前尚不清楚传递了什么SomeOtherClass,查询是如何构建的。可能已经有别名,但也可能只是一个简单的QueryOver<Course, Course> queryOver.

我的方法是用不同的方式来做。收集所有的限制。一旦存在例如一组限制IList<ICriterion>,调用 DAO 方法,创建查询并将这些限制附加到一个位置。但这是不同的故事

如果我们想对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 回答