这个问题似乎出现了一点,我还没有看到一个好的答案。我有两个没有外键的类,除了一个公共字段之外没有真正的关系,在这种情况下是“标题”。
这大致基于我最近从遗留应用程序中提取的示例,我不允许修改架构,因此不能简单地添加外键。我正在寻找的只是一个查询,该查询将为具有给定标题的课程提供所有先决条件:
select p.* from course c join prereq p on c.title = p.title
我不是在寻找像 Join()、HasMany() 等这样的映射,因为它们显然都需要定义的关系。我正在寻找基于任意列而没有映射的两个表。
不久前在这里提出的一个类似问题似乎表明可以使用 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魔术进行了查询 - 这似乎是不可能的,但如果我弄错了,请纠正我。