2010-07-21 65 views
3

我用流利的NHibernate挂钩商店和员工所在班级商店可以有很多员工如下:我如何获得NHibernate进行连接?

public class Store 
{ 
    public virtual IList<Employee> Employees { get; set; } 
    //other store properties 
} 

public class Employee 
{ 
    public virtual Store Store { get; set; } 
    public virtual bool? SomeStatus1 { get; set; } 
} 

我需要得到具有没有SomeStatus1设置为员工所有商店真正。这里

我feable尝试已经失败:

Session.CreateCriteria(typeof(Store)) 
    .Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true)) 
    .List<Store>(); 

任何想法,我怎么去这样做?

我尝试失败的原因是因为列表Employees不具有SomeStatus1的属性......这是相当明显的。

我不知道是什么,是如何获得的NHibernate只得到其在国家的员工我在找...

我觉得我想问问NHibernate的是做一个什么店加入...但我不知道如何来要求它这样做...

回答

4

您携手创建子标准

var criteria = Session.CreateCriteria(typeof(Store)); 
var join = criteria.CreateCriteria("Employees"); 
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true)); 
return criteria.List<Store>(); 

未经测试(OBV)希望工程,但你的想法。这就是我用N:1做的,但你有1:N

编辑:好的,我发布后做了一些研究。看来我所做的代码应该可以工作,但会导致加载员工集合。在ayende's blog上找到相同的基本代码。那里有一个样本,它做同样的事情,而不会导致集合被重新加载。希望有所帮助。

+0

感谢您的!它非常棒! ...但在我的实现中,我做了一个.CreateAlias(“Employees”),以便将整个语句作为单个查询发送到数据库... – mezoid 2010-07-23 01:14:15

0

我建议你使用Linq来代替Criteria API的NHibernate API。有了它,您的查询将如下:

var query = Session.Linq<Store>() 
    .Where(store => store.SomeStatus1 != true); 

var result = query.ToList(); 

更多帮助here

1

尝试:

Session.CreateCriteria(typeof(Store)) 
.CreateAlias("Employees", "e") 
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true)) 
.List<Store>();