1

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

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);

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

4

2 回答 2

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

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

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

于 2011-08-01T03:31:25.340 回答
2

I needed to solve a similar issue and decided on an alias naming convention. Then where ever you needed to reuse the alias you can check for it using GetCriteriaByAlias() and add it if it is not there. Being able to reuse the alias is very handy if you have different select projections. This method is still problematic if someone disregards naming conventions, but then your unit tests should pick that up.

Project aProject = null;
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null)
    root.JoinAlias(i => i.Project, () => aProject);
于 2012-05-02T23:30:41.043 回答