Я пытаюсь создать запрос с помощью 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)
}
Как я могу решить эту проблему?