什么可以用作NHibernate QueryOver别名?

Jon*_*onn 1 nhibernate-3 queryover

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

ClassA _aliasA;
_session.QueryOver(x => x.ClassA, () => _aliasA);
Run Code Online (Sandbox Code Playgroud)

要么

ClassA AliasA { get; set; }
_session.QueryOver(x => x.ClassA, () => AliasA);
Run Code Online (Sandbox Code Playgroud)

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

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

_session.QueryOver(x => x.ClassA, () => ClassGenericAliases.ClassA);
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ill 7

我建议永远不要在使用别名的方法范围之外的别名中使用任何东西.

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

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

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

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");
Run Code Online (Sandbox Code Playgroud)

从NHForge文档中,它说如下:

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

15.5.别名

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

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

QueryOver中的每个Lambda表达式函数都有一个相应的重载以允许使用别名,而一个.JoinAlias函数可以使用别名遍历关联而不创建子QueryOver.

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