C# NHibernate如何在HQL中两次连接到表

C# NHibernate如何在HQL中两次连接到表,c#,nhibernate,hql,C#,Nhibernate,Hql,案例和员工之间存在一对一的关系。但是,数据库中有多条记录代表同一名员工。要找到这些记录,我们需要查看员工身份。因此,如果我只有Employee.Id,我如何编写一个NHibernate查询来返回该员工的所有案例。在SQL中,我将通过两次连接到employee表来实现这一点(参见下面的示例) 如何使用HQL实现这一点?这在HQL中实际上非常简单。试试这个: 选择案例c内部连接获取c.Employee,其中c.Employee.EmployerIdentifier=:employerId 不过,如果

案例和员工之间存在一对一的关系。但是,数据库中有多条记录代表同一名员工。要找到这些记录,我们需要查看员工身份。因此,如果我只有Employee.Id,我如何编写一个NHibernate查询来返回该员工的所有案例。在SQL中,我将通过两次连接到employee表来实现这一点(参见下面的示例)


如何使用HQL实现这一点?

这在HQL中实际上非常简单。试试这个:

选择案例c内部连接获取c.Employee,其中c.Employee.EmployerIdentifier=:employerId


不过,如果我没记错的话,如果您关心延迟加载,那么这将绕过延迟加载。

这在HQL中实际上非常简单。试试这个:

选择案例c内部连接获取c.Employee,其中c.Employee.EmployerIdentifier=:employerId


但是,如果我没记错的话,如果您关心延迟加载,那么这将绕过延迟加载。

您可以使用以下逻辑

使用内存中的查询-IQueryable

您的第一个查询将是标识在Employee和EmployeeIdentifier实体之间通用的员工列表。这将是一个内存查询

Declare @TargetEmployeeID bigint
set @TargetEmployeeID = 246834
select * from Cases C
inner join Employees E on E.EmployeeID = C.EmployeeID
inner join Employees EST on EST.EmployerIdentifier = E.EmployerIdentifier
where EST.EmployeeID = @TargetEmployeeID
var caseList=new IList();
IQueryable empIdenList=Persister.Session.Query(),其中(ei=>ei.EmployeeId=246834);
caseList=Persister.Session.Query().Where(e=>empIdenList.Contains(e.Employee)).ToList();
注意-我们只在第二个查询中调用ToList(),这是实际生成查询的时间。您可以使用NHIbernate探查器查看返回的实际SQL


请参阅NHibernate.Linq DLL以查找有关Query()的更多信息。

您可以使用以下逻辑

使用内存中的查询-IQueryable

您的第一个查询将是标识在Employee和EmployeeIdentifier实体之间通用的员工列表。这将是一个内存查询

Declare @TargetEmployeeID bigint
set @TargetEmployeeID = 246834
select * from Cases C
inner join Employees E on E.EmployeeID = C.EmployeeID
inner join Employees EST on EST.EmployerIdentifier = E.EmployerIdentifier
where EST.EmployeeID = @TargetEmployeeID
var caseList=new IList();
IQueryable empIdenList=Persister.Session.Query(),其中(ei=>ei.EmployeeId=246834);
caseList=Persister.Session.Query().Where(e=>empIdenList.Contains(e.Employee)).ToList();
注意-我们只在第二个查询中调用ToList(),这是实际生成查询的时间。您可以使用NHIbernate探查器查看返回的实际SQL


请参阅NHibernate.Linq DLL,以查找有关Query()的更多信息。

这并没有达到我想要的效果。注意,在上面的sql中,我必须两次连接到employee表。要按照您建议的方式执行,我需要有EmployeeIdentifier,但一开始我没有。我可以往返到DB去得到它,但我试图避免。这并没有达到我想要的。注意,在上面的sql中,我必须两次连接到employee表。要按照您建议的方式执行,我需要有EmployeeIdentifier,但一开始我没有。我可以往返到DB去得到它,但我试图避免。
var caseList = new IList<Case>();

IQueryable<EmployeeIdentifier> empIdenList =  Persister.Session.Query<EmployeeIdentifier>().Where(ei => ei.EmployeeId = 246834);

caseList = Persister.Session.Query<Case>().Where(e => empIdenList.Contains(e.Employee)).ToList<Case>();