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进行此操作?
答案 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
如果我没记错的话,如果这是你关注的事情,这将绕过延迟加载。