这是我第一次用NHibernate做一个大项目,所以请放心。基本上,我需要运行一个基于5个字段的搜索。
我想把结果显示在表格中。这是我写的一个测试,它基本上让所有的客户都能通过一个名为“dii”的工作人员获得收入。当我运行它时,我得到一个错误,说一些入口是空的。
var name = new Name("Alice", "B." "Cooper");
var staff = "DII";
var fileNumber = 12345;
var crit = NHibernateHelper.GetCurrentSession().CreateCriteria(typeof(Client));
var result = crit.CreateAlias("Intakes", "i");
.Add(Restrictions.Like("Name.First", name.First + "%"));
.Add(Restrictions.Like("Name.Middle", name.Middle + "%"));
.Add(Restrictions.Like("Name.Last", name.Last + "%"));
.Add(Restrictions.Eq("i.Staff", staff));
.Add(Restrictions.Eq("i.FileNumber", fileNumber));
.List<Client>();
foreach (var client in result)
{
Assert.IsTrue(client.Intakes.All(i => i.Staff == "DII");
}
但是,它确实返回了正确数量的客户机。我的问题是,如何只迭代上面的icriteria生成的查询所返回的关联的入口?
我尝试将最后一行修改为:
Assert.IsTrue(c.Intakes.Where(i => i != null).All(i => i.Staff == "DII"));
它工作正常,除了生成的SQL是:
SELECT (Client + Intake Join) ...
SELECT FROM IntakeTable ...
SELECT FROM IntakeTable ...
SELECT FROM IntakeTable ...
(for each Intake that was returned with the join)
这意味着它运行连接,然后再次获取所有的入口,这不是我想要的。