c# - 如何从其他函数和类访问 NH QueryOver 别名?

标签 c# nhibernate

我希望能够在其他几个函数中使用一个特定的查询,我有一个类只为特定域创建一个专门的 QueryOver 对象。

但是该函数使用别名对象来创建连接。我如何从另一个函数访问这些别名?

例如,假设我有类(class)实体,每个实体都有一组学生。 而且我总是只想获得Active(一个 bool 值)类(class)

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”的类(class)。但是我无法访问 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 .它被解析,它的字符串部分 "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"));
    ...

关于c# - 如何从其他函数和类访问 NH QueryOver 别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16849582/

相关文章:

c# - 新表格问题c#

nhibernate queryover join 与子查询以获取聚合列

spring - 如何在 Kotlin 中使用扩展属性作为常量?

nhibernate - 枚举到整数的映射导致每次刷新时都会更新

c# - 无法加载文件或程序集 'System.Windows.Interactivity'

c# - 在类中多次使用 IDisposable 对象的更好方法

C# TPL怎么知道所有的任务都完成了?

c# - 如何在我的自定义类上使用 IDisposable?

c# - NHibernate Query<> 与 QueryOver<> 之间有什么区别?

Nhibernate C# - 仅返回字符串属性不为 null 或空的对象