【问题标题】:Too many results when eager fetching data by nHibernate通过 nHibernate 急切获取数据时结果太多
【发布时间】:2016-04-30 23:30:39
【问题描述】:

我正在尝试使用以下代码示例测试我的测试工具:

public void Test_tools()
{
     // Arrange
     DateTime appointmentDate = DateTime.Now;    
     DateTime appointmentDate2 = DateTime.Now - TimeSpan.FromDays(5);
     DateTime appointmentDate3 = DateTime.Now - TimeSpan.FromDays(10);

     string firstName = "Frank";
     string lastName = "Carter";

     DatabaseTools.AddPatientToDatabase(firstName, lastName,
             appointmentDate, appointmentDate2, appointmentDate3);

     var patients = DatabaseTools.GetPatientFromDatabase(firstName, lastName);
}

首先,我向数据库添加了一个带有 3 个 AppointmentEntity 类的 PatientEntityAddPatientToDatabase 方法):

public static void AddPatientToDatabase(string firstName, 
         string lastName, params DateTime[] appointmentDate)
{
    PatientEntity patient = new PatientEntity
    {
        FirstName = firstName,
        LastName = lastName
    };

    foreach (DateTime item in appointmentDate)
    {
        var appointment = new AppointmentEntity
        {
            Date = item
        };
        patient.AddAppointment(appointment);
    }

    ISessionFactory sessionForTests =
              NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME);

    using (ISession session = sessionForTests.OpenSession())
    {
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(patient);
            transaction.Commit();
        }
    }
}

接下来我尝试使用 GetPatientFromDatabase 方法使用 FirstName 和 LastName 条件从数据库中获取 PatientEntity,如下所示:

public static IList<PatientEntity> GetPatientFromDatabase(string firstName, string lastName)
{
    ISessionFactory sessionForTests = 
            NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME);

    using (ISession session = sessionForTests.OpenSession())
    {
        return session.QueryOver<PatientEntity>()
                 .Where(k => k.FirstName == firstName && k.LastName == lastName)
                 .Fetch(x => x.Appointments).Eager.List();
    }
}

问题是,我收到的 PatientEntity 类与添加的 AppointmentEntity 类一样多(而不仅仅是一个)。在 3 个结果中的每一个中,患者都是相同的,具有相同的 ID 和一组约会。我设置的查询中有什么错误?我正在使用 PostgreSQL 数据库,其中(使用 pgAdmin)我看到,所有设置都正确。问题是,我应该如何查询才能在他的 Appointments 集合中只获得一个 PatientEntity 和三个 AppointmentEntity 类。

编辑:

我也尝试过使用 CreateCriteria,但是一旦我设置了预约列表的即时获取,我得到了 3 个相同的患者而不是 1 个。可能是急切预约集合初始化中的错误吗?

public static IList<PatientEntity> GetPatientFromDatabase(string firstName, string lastName)
{
    ISessionFactory sessionForTests = NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME);
    using (ISession session = sessionForTests.OpenSession())
    {
        return session.CreateCriteria<PatientEntity>()
            .Add(Expression.Eq("FirstName", firstName))
            .Add(Expression.Eq("LastName", lastName))
            .SetFetchMode("Appointments", FetchMode.Eager)
            .List<PatientEntity>();
    }
}

【问题讨论】:

  • 看起来该患者有 3 次预约,或者您有多个患者的名字和姓氏相同(或两者都相同)。
  • @jdweng 谢谢你的回复。我澄清了我的问题。数据库在测试前被删除,因此只有测试中添加的内容 - 一名患者与三个预约。我的问题是为什么(当我按姓名和姓氏查询时)我得到的患者结果与预约一样多(每个记录中的患者都是相同的)。
  • 你为什么要预约? .Fetch(x => x.Appointments)
  • 据我了解(我可能不了解),我这样做是因为我在查询之后关闭了会话。如果我不获取数据,那么我的患者中就没有约会列表。我试图避免延迟初始化。
  • 数据库的每一行都包含名字、姓氏和约会。因此,您可以使用 Distinct() 或 GroupBy 来获取唯一的名字和姓氏。请参阅以下网页:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

标签: c# nhibernate queryover


【解决方案1】:

在@jdweng 的帮助下,我能够提出另一个查询,它允许我获得初始化的约会集合,而患者列表中没有重复:

    public static IList<PatientEntity> GetPatientFromDatabase(string firstName, 
                    string lastName)
    {
        ISessionFactory sessionForTests = 
               NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME);

        using (ISession session = sessionForTests.OpenSession())
        {
            return session.QueryOver<PatientEntity>()
                .Where(k => k.FirstName == firstName && k.LastName == lastName)
                .Fetch(x => x.Appointments).Eager
                .TransformUsing(Transformers.DistinctRootEntity).List();
        }
    }

【讨论】:

    猜你喜欢
    • 2016-10-07
    • 2011-06-24
    • 2011-08-10
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多