到目前为止,我知道局部变量或局部属性可以用作别名
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);
静态可以用作别名吗? 是否还有其他声明别名的选项?
答案 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);