NHibernate QueryOver加入不相关的实体

Dav*_*and 9 nhibernate queryover

我有以下查询工作,它获得我想要的结果:

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();
Run Code Online (Sandbox Code Playgroud)

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

此查询使用SELECT ... FROM MyObject WHERE EXISTS(此处为DatabaseView的子查询)返回IList.如何重新编写此信息以返回相同的信息,而不是使用JOIN?

Rom*_*hin 8

在 NHibernate 5.1+ 中,QueryOver/Criteria 可以通过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();
Run Code Online (Sandbox Code Playgroud)

标准示例:

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();
Run Code Online (Sandbox Code Playgroud)


ITh*_*wer 7

您可以在NHibernate 3+中使用Linq加入不相关的实体

有趣的是,你使用join查询表达式元素:

from type1 in Repository.Query<MyType1>() 
join type2 in Repository.Query<MyType2>() 
on type1.Id equals type2.Id
Run Code Online (Sandbox Code Playgroud)

注意:Repository.Query只是从会话中返回一个IQueryable Query

我希望QueryOver有一个解决方案,因为我并不总是希望在我的域中建模双向关系,但它们仍然可用于查询.

此外,您可以使用Criteria API映射Access ="noop"双向关系,而无需放入POCO类:

http://ayende.com/blog/4054/nhibernate-query-only-properties

  • 当与两个`IQueryable`实例连接时,这实际上有效.令我惊讶的是,这适用于LINQ(`Query <>`)实现,但不适用于`QueryOver <>` (2认同)