nhibernate createalias-连接任意列
-
25-10-2019 - |
题
这个问题似乎有点出现,我还没有看到一个很好的答案。我有两个没有外键的类,除了一个共同的领域,在这种情况下,我没有其他关系。
这是基于我最近从旧应用程序中提取的示例而宽松的,我不允许修改模式,因此简单地添加外键不是选项。我要寻找的只是一个查询,它将提供带有给定标题的课程的所有先决条件:
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/corriterion魔术的查询 - 这似乎是不可能的,但如果我误会了,请纠正我。
解决方案
一种方法是创建一个独立的标准并通过子查询执行A。
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 exists (SELECT title as y0_
FROM Course this_0_
WHERE this_0_.Title = this_.Title)
不隶属于 StackOverflow