ner*_*aga 4 .net nhibernate icriteria nhibernate-mapping linq-to-nhibernate
这个问题似乎有点出现,我还没有看到一个好的答案.我有两个没有外键的类,除了一个公共字段之外没有真正的关系,在本例中是"Title".
这基于我最近从遗留应用程序中提取的示例,我不允许修改架构,因此只是添加外键不是一种选择.我正在寻找的是一个查询,它将为具有给定标题的课程提供所有先决条件:
select p.* from course c join prereq p on c.title = p.title
Run Code Online (Sandbox Code Playgroud)
我不是在寻找像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>
Run Code Online (Sandbox Code Playgroud)
这就是我想出来的,但它似乎没有用.有什么建议?
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();
Run Code Online (Sandbox Code Playgroud)
这很容易与LinqToSql一起使用,可以用Liniber提供者为NHibernate完成吗?我看到的例子似乎表明提供者基本上对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>();
Run Code Online (Sandbox Code Playgroud)
这将生成以下sql where子句: -
WHERE exists (SELECT title as y0_
FROM Course this_0_
WHERE this_0_.Title = this_.Title)
Run Code Online (Sandbox Code Playgroud)