Я использую Entity Framework и имею таблицу BusinessUnits, которая может ссылаться на другую запись того же типа для формирования дочерней и родительской иерархии.
У меня также есть набор пользователей и пользовательских разрешений, где каждый пользователь, определенный в этой таблице, должен иметь доступ к BusinessUnit и всем суббизнес-подразделениям в иерархии. Пользователи не должны иметь доступа к BusinessUnit выше указанного (если он существует).
Как я могу формировать запросы LINQ для обработки этого самоссылающегося дерева отношений и возврата всех бизнес-единиц (с дочерними единицами), к которым у этого пользователя есть доступ? Можно ли сделать это в одном запросе, или мне нужно вручную построить дерево с помощью цикла for?
Я видел ссылку схемы таким образом от узла к родителю, означает ли это, что я должен начать с самого дальнего дочернего узла, чтобы построить дерево по одному родителю за раз?
Заранее спасибо,
Крис
class BusinessUnit
{
int BusinessUnitID {get;set;}
public string BusinessName {get;set;}
BusinessUnit ParentBusinessUnit {get;set;}
}
class User
{
int UserID {get;set;}
string Firstname {get;set;}
}
class UserPermissions
{
[Key, ForeignKey("BusinessUnit"), Column(Order = 0)]
BusinessUnit BusinessUnit {get;set;}
[Key, ForeignKey("User"), Column(Order = 1)]
User User {get;set;}
}
IEnumerable<BusinessUnit> GetUnitsForWhichUserHasAccess(User user)
{
/* Example 1
given: BusinessUnitA (ID 1) -> BusinessUnitB (ID 2) -> BusinessUnitC (ID 3)
with user with ID 1:
and UserPermissions with an entry: BusinessUnit(2), User(1)
the list { BusinessUnitB, BusinessUnitC } should be returned
*/
/* Example 2
given: BusinessUnitA (ID 1) -> BusinessUnitB (ID 2) -> BusinessUnitC (ID 3)
with user with ID 1:
and UserPermissions with an entry: BusinessUnit(1), User(1)
the list { BusinessUnitA, BusinessUnitB, BusinessUnitC } should be returned
*/
}