什么可以用作 NHibernate QueryOver 别名?

发布于 2024-11-27 14:42:25 字数 491 浏览 2 评论 0原文

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

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

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

I know so far that a local variable or a local property can be used as an alias like so

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

or

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

I want to know what other options are possible. Like, are properties of an external class a valid option?

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

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

Can statics be used as aliases?
Are there other options for declaring aliases?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放血 2024-12-04 14:42:25

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

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。

因此,坚持只在方法范围内使用变量。

I would recommend never using anything for an Alias outside of the scope of the method that uses the alias.

QueryOver is a strongly typed version of Criteria, in Criteria an alias was a string value.

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

But now it needs to assign the alias to a variable so we just create one for it:

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

From NHForge documentation, it says the following:

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

15.5. Aliases

In the traditional ICriteria interface aliases are assigned using
'magic strings', however their value does not correspond to a name in
the object domain. For example, when an alias is assigned using
.CreateAlias("Kitten", "kittenAlias"), the string "kittenAlias" does
not correspond to a property or class in the domain.

In QueryOver, aliases are assigned using an empty variable. The
variable can be declared anywhere (but should be null at runtime). The
compiler can then check the syntax against the variable is used
correctly, but at runtime the variable is not evaluated (it's just
used as a placeholder for the alias).

Each Lambda Expression function in QueryOver has a corresponding
overload to allow use of aliases, and a .JoinAlias function to
traverse associations using aliases without creating a sub-QueryOver.

So stick to just using a variable in the scope of the method.

欢你一世 2024-12-04 14:42:25

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

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

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文