NHibernate-不带映射的连接

NHibernate-不带映射的连接,nhibernate,join,criteria,queryover,Nhibernate,Join,Criteria,Queryover,我知道有人问过类似的问题,可能是重复的 但这两个地方都没有恰当地回答这个问题,我不得不再次问:( 问题是,当两个表之间没有可用的映射时,是否可以使用CriteriaAPI连接它们 例如 我需要生成一个查询,比如 select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId 如果有人知道这一点,请提供帮助。请注意,我需要使用标准或查询技术来实现这一点 谢谢 /B

我知道有人问过类似的问题,可能是重复的

但这两个地方都没有恰当地回答这个问题,我不得不再次问:(

问题是,当两个表之间没有可用的映射时,是否可以使用CriteriaAPI连接它们

例如

我需要生成一个查询,比如

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId
如果有人知道这一点,请提供帮助。请注意,我需要使用标准或查询技术来实现这一点

谢谢
/BB

这里有一个关于如何做到这一点的想法,但它有点难看

由于映射没有说明顺序用户之间的关系存在,因此很难让NHibernate在这两个表之间生成联接。 您可以改为执行一个内部选择,使您的SQL查询如下所示:

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o
在QueryOver上可以这样做:

Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();
Order=null;
User=null;
QueryOver query=QueryOver.Of(()=>user)
.Select(Projections.ProjectionList())
.Add(Projections.Property(x=>x.UserName)))
.Add(Projections.Property(x=>x.WhateverOtherPropertyNameFromUser)))
.Where(Restrictions.EqProperty(“user.Id”、“order.UserId”));
var result=session.QueryOver(()=>order)
.Select(Projections.ProjectionList())
.Add(projects.Property(c=>c.OrderId))
.Add(projects.Property(c=>c.WhateverOtherPropertyNameFromOrder))
.Add(Projections.SubQuery(query)))
.List();

我不知道这对您是否有用,但它是您问题的潜在解决方案。

谢谢,但我决定添加映射。知道没有映射就不可能做到这一点确实很有帮助。:)只是澄清一下,这只是API标准的一个限制。HQL和LINQ非常适合临时连接。@Oskarbergren您能详细说明一下吗?任何详细说明替代方法的链接?我只是说,使用常规LINQ,您可以加入任何内容(例如,从Xs中的x到Ys中的y,其中x.Field==y.Field)。NHibernate映射不需要知道X和Y之间的任何特殊关系。
Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();