代码之家  ›  专栏  ›  技术社区  ›  cdmckay

迭代nHibernate联接

  •  0
  • cdmckay  · 技术社区  · 15 年前

    这是我第一次用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)
    

    这意味着它运行连接,然后再次获取所有的入口,这不是我想要的。

    1 回复  |  直到 15 年前
        1
  •  0
  •   cdmckay    15 年前

    啊,明白了。因为我的地图。我用的是:

    <list ... />
    

    …并通过非位置列排序。正因为如此,我在我的招生协会中得到了一堆空条目。

    我把它变成了一个订好的袋子,一切都如你所料。