NHibernate QueryOver:如何加入不相关的实体? [英] NHibernate QueryOver: How to join unrelated entities?

查看:36
本文介绍了NHibernate QueryOver:如何加入不相关的实体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下查询可以得到我想要的结果:

I have the following query working which gets the results I want:

int associatedId = 123;

MyObject alias = null;

var subQuery = QueryOver.Of<DatabaseView>()
    .Where(view => view.AssociatedId == associatedId)
    .And(view => view.ObjectId == alias.ObjectId)
    .Select(view => view.ObjectId);

var results = session.QueryOver<MyObject>(() => alias)
    .WithSubquery.WhereExists(subQuery)
    .List();

DatabaseView 已被映射为一个实际的 NHibernate 实体(因此我可以将它与 QueryOver 一起使用),但它与 MyObject 没有关联> 在 HBM 映射中.

The DatabaseView has been mapped as an actual NHibernate entity (so I can use it with QueryOver), but it is not associated to MyObject in the HBM mappings.

此查询使用 SELECT ... FROM MyObject WHERE EXISTS(此处为 DatabaseView 的子查询) 返回一个 IList.如何重写它以返回相同的数据但使用 JOIN 而不是子查询?

This query returns an IList<MyObject> using a SELECT ... FROM MyObject WHERE EXISTS (subquery for DatabaseView here). How can I re-write this to return the same data but using a JOIN instead of sub query?

推荐答案

在 NHibernate 5.1+ 中,QueryOver/Criteria 可以通过 实体加入:

In NHibernate 5.1+ it's possible for QueryOver/Criteria via Entity Join:

int associatedId = 123;

MyObject alias = null;
DatabaseView viewAlias = null;

var results = session.QueryOver<MyObject>(() => alias)
    .JoinEntityAlias(() => viewAlias, () => viewAlias.ObjectId == alias.ObjectId && viewAlias.AssociatedId == associatedId)
    .List();

标准示例:

int associatedId = 123;
var results = session.CreateCriteria<MyObject>("alias")
    .CreateEntityAlias(
            "viewAlias",
            Restrictions.EqProperty("viewAlias.ObjectId", "alias.ObjectId")
            && Restrictions.Eq("viewAlias.AssociationId", associatedId),
            JoinType.InnerJoin,
            typeof(DatabaseView).FullName)
    .List();

这篇关于NHibernate QueryOver:如何加入不相关的实体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆