2011-01-20 106 views
2

我知道类似的问题已被要求herehere它可能是重复的。NHibernate - 没有映射加入

但问题并没有在这两个地方适当的那么不情愿地回答,我再问它:(

问题是,你可以使用标准的API来连接两个表时,有没有之间的可用映射它们。

class Order{ UserId , OrderId} 
class User{UserId , UserName} 

,我需要生成查询一样,

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId 

如果有人知道this..and的请你注意,我需要使用标准或QueryOver技术

感谢 /BB它做的请帮忙

回答

5

这里是它如何可以做到的想法,但这有点难看。

由于映射没有规定的关系令和用户之间存在因此它是相当难有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[]>(); 

我不知道,如果这对你来说是有用的,但它是你的问题的一个潜在的解决方案。

+0

谢谢,但我决定添加映射。要知道这是不可能的,没有映射确实是有帮助的。 :) – Illuminati 2011-01-24 06:46:57