NHibernate如何在HQL中连接两次表

时间:2010-07-16 18:57:01

标签: c# nhibernate hql

public class Case
{
    public int Id { get; set; }
    public string Number { get; set; }
    public Employee Employee { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string EmployerIdentifier { get; set; }
    public Case Case { get; set; }
}

Case和Employee之间存在一对一的关系。但是,DB中有多个记录代表同一个Employee。要查找这些记录,我们会查看EmployerIdentifier。所以如果我只有Employee.Id我怎么能写一个NHibernate查询返回该Employee的所有案例。在SQL中,我会通过两次加入employee表来实现它(参见下面的示例)。

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

我如何使用HQL进行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用以下逻辑。

使用内存查询 - IQueryable。

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

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>();

注意 - 我们仅在第二个查询中执行ToList()调用,这是查询实际生成的时间。您可以使用NHIbernate Profiler查看生成的实际SQL。

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

答案 1 :(得分:0)

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

SELECT Case c INNER JOIN FETCH c.Employee WHERE c.Employee.EmployerIdentifier=:employerId

如果我没记错的话,如果这是你关注的事情,这将绕过延迟加载。