NHibernate как присоединиться к таблице дважды в HQL - PullRequest
1 голос
/ 16 июля 2010
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; }
}

Между делом и сотрудником существует отношение один к одному.Однако в БД есть несколько записей, которые представляют одного и того же сотрудника.Чтобы найти эти записи, мы смотрим на EmployerIdentifier.Поэтому, если у меня есть только Employee.Id, как я могу написать запрос NHibernate, который возвращает все случаи для этого Employee.В SQL я бы сделал это, присоединившись к таблице сотрудников дважды (см. Пример ниже).

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 ]

1 голос
/ 05 июля 2012

Вы можете использовать следующую логику.

Использовать запрос в памяти - IQueryable.

Первым вашим запросом будет определение списка сотрудников, общих для сущностей Employee и EmployeeIdentifier.Это будет запрос в памяти.

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 () только во 2-м запросе, и это когда запрос фактически генерируется.Вы могли бы использовать NHIbernate Profiler, чтобы увидеть реальный SQL, который генерируется обратно.

Обратитесь к NHibernate.Linq DLL, чтобы узнать больше о Query ().

0 голосов
/ 17 июля 2010

На самом деле это очень просто в HQL. Попробуйте это:

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

Однако, если я правильно помню, это обойдет ленивую загрузку, если вас это беспокоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...