Entity Framework Обход и возврат дочерних записей в таблице ссылок на себя

Я использую 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
*/
}
13
задан g18c 24 May 2012 в 21:55
поделиться