NHibernate QueryOver Левое внешнее объединение с условиями из списка - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь создать запрос с помощью NHibernate QueryOver, используя левое внешнее соединение, которое использует коллекцию в качестве условия. User может иметь различные роли в Department. Location объекты добавляются пользователями и не зависят от отдела. Пользователи всех отделов могут добавить местоположение как FavouriteLocation.

Мои занятия выглядят так:

public class Location
{
    public virtual long Id { get; set;
    public virtual string Name { get; set; }
    public virtual IList<FavouriteLocation> Favourites { get; set; }
}

public class User
{
    public virtual long Id { get; set;
    public virtual string Firstname { get; set; }
    public virtual string Lastname { get; set; }
    public IList<UserDepartmentRole> DepartmentRoles { get; set; }
}

public class FavouriteLocation
{
    public virtual long Id { get; set; }
    public virtual Location Location { get; set; }
    public virtual User { get; set; }
}

public class Department
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
}

public class UserDepartmentRole 
{
    public virtual long Id { get; set; }
    public virtual Guid RoleGuid { get; set; }
    public virtual User User { get; set; }
    public virtual Department Department { get; set }
    public virtual bool IsActive { get; set; }
}

У меня есть функция, которая выполняет запрос для извлечения объекта Location с его избранными, сохраненными пользователями определенного отдела. Я пробовал это с помощью следующего запроса, но когда Location не сохраняется в качестве избранного, запрос возвращает null.

public Location GetLocation(long departmentId, long locationId)
{
    UserDepartmentRole departmentRoleAlias = null;
    FavouriteLocation favouriteAlias = null;

    var departmentUserSubQuery = QueryOver.Of<User>()
        .JoinAlias(user => user.DepartmentRoles, () => departmentRoleAlias)
        .Where(() => departmentRoleAlias.Department.Id == departmentId)
        .Where(() => departmentRoleAlias.IsActive)
        .Select(user => user.Id);

    var location = Session.QueryOver<Location>()
        .JoinAlias(l => l.Favourites, () => favouriteAlias, JoinType.LeftOuterJoin)
        .WithSubQuery.WhereProperty(() => favouriteAlias.User.Id)
        .In(departmentUserSubQuery)
        .Where(l => l.Id == locationId)
}

Как я могу решить эту проблему?

...