【发布时间】: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 类的 PatientEntity(AddPatientToDatabase 方法):
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