2015-10-15 86 views
1

我想创建一个到多个实体之间的连接查询。正如我给出的例子,Fluent Nhibernate where子句一对多

UserEntity

public class UserEntity 
    { 
     public virtual int Id {get;set;} 
     public virtual IList<Card> Cards{get;set;} 

    } 

而且CardEntity

public class CardEntity 
    { 
     public virtual int Id {get;set;} 
     public virtual int CardNumber {get;set;} 
     public virtual UserEntity User{get;set;} 
    } 

UserMapping

public UserEntityMap() 
    { 
     Table("user"); 
     Id(x => x.Id); 
     HasMany(x => x.Cards).KeyColumn("User_Id").Fetch().Join(); 

    } 

CardMapping

public CardEntityMap() 
    { 
     Table("card"); 
     Id(x => x.Id); 
     Map(x => x.CardNumber); 
     References(x => x.User).Column("User_id"); 
    } 

查询

var query = _session.QueryOver<UserEntity>(); 
if(!string.IsNullOrEmpty(cardNumber) 
{ 
    query.Where(x=>x.Cards.Any(c=>c.CardNumber == cardNumber)) /// Tried this get an error 
} 

我希望看到像

Select * from user u join card c on c.user_id=u.id where c.number=cardNumber 

我知道必须有这样做的逻辑方式,但我不能找出一个输出。谢谢你的帮助。

回答

3

您是否尝试过使用NHibernate.Linq而不是QueryOver?

如果你把“使用NHibernate.Linq”在文件的顶部,你将能够使用

_session.Query<UserEntity>(); 

,而不是它可能给你你正在寻找的结果。

或者(使用QueryOver),你可能看使用JoinAlias:

Card card; // Used for alias below 

query.JoinAlias(u => u.Cards,() => card) 
    .Where(() => card.CardNumber == cardNumber) 
+0

好去处! ;)是的,'。任何'与LINQ ===查询,而不是QueryOver –

+0

感谢您的答案:)我会给JoinAilas一个尝试。我尝试查询而不是QueryOver,但有一些属性,我需要在QueryOver,所以我用它。我对使用JoinAlias或JoinQueyOver感到困惑,因为我想必须有更简单的方法或更好的方法来创建查询。但我认为我错了 – eyildiz