gpt4 book ai didi

.net - NHibernate CreateAlias - 连接任意列

转载 作者:行者123 更新时间:2023-12-01 16:34:22 24 4
gpt4 key购买 nike

这个问题似乎出现了一点,但我还没有看到一个好的答案。我有两个类,没有外键,除了公共(public)字段之外没有真正的关系,在本例中为“标题”。

这大致基于我最近从遗留应用程序中提取的示例,我不允许修改架构,因此简单地添加外键不是一个选项。我正在寻找的只是一个查询,该查询将提供具有给定标题的类(class)的所有先决条件:

 select p.* from course c join prereq p on c.title = p.title

我不是在寻找像 Join()、HasMany() 等这样的映射,因为它们显然都需要定义的关系。我正在寻找基于任意列的没有映射的连接两个表。

类似的问题asked here不久前似乎表明可以使用 CreateAlias() 但我还没有找到任何好的例子。

   <class name="Course" table="course">
<id name="id" column="id" type="long">
<generator class="identity" />
</id>
<property name="Title" column="Title" type="String" />
</class>

<class name="Prereq" table="prereq">
<id name="id" column="id" type="long">
<generator class="identity" />
</id>
<property name="Title" column="Title" type="String" />
<property name="PrereqTitle" column="PrereqTitle" type="String" />
</class>

这是我想出来的,但似乎不起作用。有什么建议吗?

        var results = session.CreateCriteria(typeof(Prereq)) 
.CreateAlias("Course", "C")
.CreateAlias("Prereq", "P")
.Add( Expression.EqProperty("C.Title", "P.Title"))
.Add( Expression.Eq("C.Title", "Course With Prereq"))
.List();

使用 LinqToSql 很容易做到这一点,是否可以使用 NHibernate 的 Linq 提供程序来完成?我看到的例子似乎表明,提供程序基本上将查询完成到 NH 使用的任何 ICriteria/ICriterion 魔法 - 这似乎不可能,但如果我错了,请纠正我。

最佳答案

一种方法是创建一个独立的条件并通过子查询执行存在。

var dc = DetachedCriteria.For<Course>("c")
.SetProjection(Projections.Property("c.Title"))
.Add(Restrictions.EqProperty("c.Title", "p.Title"));

return Session.CreateCriteria<Prereq>("p")
.Add(Subqueries.Exists(dc)).List<Prereq>();

这将生成以下 sql where 子句:-

WHERE exists (SELECT title as y0_
FROM Course this_0_
WHERE this_0_.Title = this_.Title)

关于.net - NHibernate CreateAlias - 连接任意列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com