什么可以用作NHibernate QueryOver别名?

时间:2011-08-01 02:25:40

标签: queryover nhibernate-3

到目前为止,我知道局部变量或局部属性可以用作别名

ClassA _aliasA;
_session.QueryOver(x => x.ClassA, () => _aliasA);

ClassA AliasA { get; set; }
_session.QueryOver(x => x.ClassA, () => AliasA);

我想知道其他选项是可行的。比如,外部类的属性是有效选项吗?

class ClassGenericAliases
{
    ClassA Class { get; set; }
}

_session.QueryOver(x => x.ClassA, () => ClassGenericAliases.ClassA);

静态可以用作别名吗? 是否还有其他声明别名的选项?

2 个答案:

答案 0 :(得分:7)

我建议永远不要在使用别名的方法范围之外的别名中使用任何内容。

QueryOver是Criteria的强类型版本,在Criteria中,别名是字符串值。

IList cats = sess.CreateCriteria(typeof(Cat))
    .CreateAlias("Kittens", "kt")
    .CreateAlias("Mate", "mt")
    .Add( Expression.EqProperty("kt.Name", "mt.Name") )
    .List();

但现在需要将别名分配给变量,所以我们只为它创建一个:

Cat catAlias = null;
Kitten kittenAlias = null;

IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => catAlias.Age > 5)
        .And(() => kittenAlias.Name == "Tiddles");

从NHForge文档中,它说明如下:

http://nhibernate.info/doc/nh/en/index.html#queryqueryover-aliases

  

15.5。别名

     

在传统的ICriteria界面中,使用分配别名   '魔术字符串',但是它们的值与...中的名称不对应   对象域。例如,使用时分配别名   .CreateAlias(“Kitten”,“kittenAlias”),字符串“kittenAlias”   不对应于域中的属性或类。

     

在QueryOver中,使用空变量分配别名。该   变量可以在任何地方声明(但在运行时应该为null)。该   然后编译器可以检查使用的变量的语法   正确,但在运行时,不评估变量(它只是   用作别名的占位符)。

     

QueryOver中的每个Lambda Expression函数都有一个对应的   允许使用别名的过载,以及.JoinAlias函数   使用别名遍历关联而不创建子QueryOver。

所以坚持只使用方法范围内的变量。

答案 1 :(得分:2)

我需要解决类似的问题并决定别名命名约定。然后你需要重用别名,你可以使用GetCriteriaByAlias()检查它,如果它不存在则添加它。 如果您有不同的选择投影,则能够重用别名非常方便。如果有人忽视命名约定,这种方法仍然存在问题,但是你的单元测试应该选择它。

Project aProject = null;
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null)
    root.JoinAlias(i => i.Project, () => aProject);