【问题标题】:Iterating an NHibernate join迭代 NHibernate 连接
【发布时间】:2009-06-10 21:17:32
【问题描述】:

这是我第一次将 NHibernate 用于大型项目,请耐心等待。基本上,我需要基于 5 个字段进行搜索。

我想在表格中显示结果。这是我编写的一个测试,它基本上可以让所有拥有名为“DII”的员工的客户。当我运行它时,我收到一条错误消息,指出某些 Intakes 为空。

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 生成的查询返回的相关 Intake?

我尝试将最后一行修改为:

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)

意思是它运行 Join,然后再次获取所有 Intake,这不是我想要的。

【问题讨论】:

    标签: c# .net nhibernate join icriteria


    【解决方案1】:

    Doh,想通了。这是因为我的映射。我正在使用:

    <list ... />
    

    ...并按非位置列排序。因此,我的 Intakes 关联中出现了一堆空条目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-12
      • 2012-12-17
      • 2013-07-02
      • 1970-01-01
      • 2011-10-04
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多