这个问题似乎出现了,我还没有看到一个好的答案。我有两个类,除了一个公共字段外,没有外键,也没有任何实际关系,在本例中为“标题”。
这大致是基于我最近从旧版应用程序中提取的示例,不允许修改架构,因此仅添加外键是不可行的。我要寻找的只是一个查询,它将为具有给定标题的课程提供所有先决条件:
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)