如何从其他函数和类访问NH QueryOver别名
本文关键字:访问 NH QueryOver 别名 其他 函数 | 更新日期: 2023-09-27 18:16:06
我希望能够在其他几个函数中使用一个特定的查询,我有一个类,它只是为特定域创建一个专门的QueryOver对象。
但是该函数使用别名对象来创建连接。我如何从另一个函数访问这些别名?
例如,我有Course实体,每个实体都有一个学生集合。我总是想只得到Active
(bool值)课程
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
中,我想修改查询以仅获取"Bob"注册的课程。但是我不能访问studentAlias,因为它是在另一个函数中定义的。
我在这里能做什么,还是我设置的完全不正确?
实际上,我们可以在SomeOtherClass
中重新声明相同的变量。
public List<Course> GetActiveCourseSummary(QueryOver<Course, Course> queryOver)
{
Address studentAlias = null;
var query = queryOver.Where(() => studentAlias.Name == "Bob");
...
}
关键是,名称studentAlias
(局部变量Address的名称)与方法GetQuery()
中的名称相同。这将工作,因为我们在.Where()
方法中传递的是Expression
。在GetQuery()中对其进行解析,其字符串部分"studentAlias"
的使用方式与之前相同。
,
我会说,这不是我要用的方式。目前尚不清楚传递到SomeOtherClass
的内容,查询是如何构建的。已经可以有别名,但也可以只是一个简单的QueryOver<Course, Course> queryOver
。
我的方法是用不同的方式来做。收集所有的限制条件。一旦有一组限制IList<ICriterion>
,调用DAO方法,创建查询并在一个地方附加这些限制。但这是另一回事
如果我们想在SomeOtherClass中得到更多的检查,我们可以使用Criteria API。缺点是我们必须使用字符串表示属性"学生"answers"代码"(不像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"));
...