Как представить и отфильтровать связанную модель данных в EF6 - PullRequest
0 голосов
/ 04 февраля 2020

Я изо всех сил пытался получить желаемый результат на основе простой модели данных. Может кто-нибудь взглянуть и поставить меня на правильный путь?

Я моделирую настраиваемую схему «разрешения на основе группы» в список Реквизиций. У меня есть одна таблица для хранения списка групп, одна таблица для хранения «членства» (GroupMembership) для групп (ы) и таблица для хранения того, какие разрешения (чтение / запись) групп (ы) имеют для заявки (ReqGroups). Я даже попробовал подход, основанный на базе данных, используя. NET framework, именно так я сгенерировал диаграмму БД. Это приводило к ошибкам циклической ссылки, когда я использовал сгенерированные модели в своем проекте. NET Core API. Screenshot of data model

Я могу легко представить желаемый результат через T- SQL:

SELECT r.*, x.Rights FROM Requisition r
INNER JOIN 
(
   SELECT rp.RequisitionID, rp.Rights from ReqGroup rp
   INNER JOIN GroupMembership m on m.GroupID = rp.GroupID
   WHERE m.UserId = @UserId
) x on r.Id = x.RequisitionID

Через много проб и ошибок я смог чтобы получить данные из EF с помощью этого запроса:

_context.Requisition
  .Include("ReqGroups.Group.GroupMemberships")
  .ToListAsync();

Но тогда мне нужно отфильтровать связанные данные (GroupMembership), что кажется невозможным в EF Core. Единственная альтернатива, которую я вижу, - это изменить отношения в модели, чтобы я мог фильтровать GroupMembership UserId на основе текущего пользователя и Включить заявку (и).

Заранее спасибо за любые рекомендации.

1 Ответ

0 голосов
/ 04 февраля 2020

Хм, должно быть возможно. Примерно так:

var query = _context.Requisition
    .Where(x => x.ReqGroup
        .Any(rg => rg.Group.GroupMembership.UserId == userId)
    .Select( x => new 
    {
        Requisition = x,
        UserReqGroupRights = x.SelectMany(x => x.ReqGroup
            .Where(rg => rg.Group.GroupMemberShip.UserId == userId)
            .Select(rg => rg.Rights)
            .ToList()
    });

Возвращает анонимный тип, содержащий каждую заявку, имеющую связанную с пользователем группу, с коллекцией применимых прав этого пользователя.

Чтобы вернуть эти данные в представление и др c. Я бы порекомендовал выбрать в модель POCO. Отношения сущностей EF не могут быть отфильтрованы сами по себе, где вы можете выбрать заявку и только связанные группы с этим пользователем, но вы можете использовать Select для фильтрации этих данных.

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