我如何获得NHibernate进行连接?
问题描述:
我用流利的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的是做一个什么店加入...但我不知道如何来要求它这样做...
答
您携手创建子标准
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上找到相同的基本代码。那里有一个样本,它做同样的事情,而不会导致集合被重新加载。希望有所帮助。
答
我建议你使用Linq来代替Criteria API的NHibernate API。有了它,您的查询将如下:
var query = Session.Linq<Store>()
.Where(store => store.SomeStatus1 != true);
var result = query.ToList();
更多帮助here。
答
尝试:
Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();
感谢您的!它非常棒! ...但在我的实现中,我做了一个.CreateAlias(“Employees”),以便将整个语句作为单个查询发送到数据库... – mezoid 2010-07-23 01:14:15