我建议不要在使用别名的方法范围之外对别名使用任何东西。
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 中,使用空变量分配别名。该变量可以在任何地方声明(但在运行时应该为空)。然后编译器可以检查该变量的语法是否正确使用,但在运行时不会评估该变量(它只是用作别名的占位符)。
QueryOver 中的每个 Lambda 表达式函数都有一个相应的重载以允许使用别名,以及一个 .JoinAlias 函数使用别名遍历关联而不创建子 QueryOver。
所以坚持只在方法范围内使用变量。