NHibernate - 没有映射的连接

Ill*_*ati 2 nhibernate join criteria queryover

我知道在这里这里已经提出类似的问题,它可能是重复的.

但这个问题在两个地方都没有得到妥善解答,所以我不得不再问:(

问题是,当它们之间没有可用的映射时,您可以使用Criteria API来连接两个表.

例如

class Order{ UserId , OrderId} 
 class User{UserId , UserName}
Run Code Online (Sandbox Code Playgroud)

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

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId
Run Code Online (Sandbox Code Playgroud)

如果有人知道这一点,请帮助..请注意我需要使用Criteria或QueryOver技术

谢谢/ BB

tol*_*sm7 5

这是一个关于它如何完成的想法,但它有点难看.

由于映射没有说明OrderUser之间的关系存在,因此很难让NHibernate在这两个表之间生成连接.你可以做的是做一个内部选择,所以你的SQL查询看起来像这样:

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o
Run Code Online (Sandbox Code Playgroud)

这可以在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[]>();
Run Code Online (Sandbox Code Playgroud)

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