Пробламеция фильтра ObjectQuery.Include для разрешения бизнес-логики - PullRequest
0 голосов
/ 03 ноября 2011

Я создал промежуточный слой между BL и DAL Entity Framework для фильтрации данных по бизнес-логике разрешений пользователя в приложении. Мой уровень реализует IObjectSet, который имеет экземпляр «None Filtered ObjectSet», и выражение фильтра выполняется всякий раз, когда используется ObjectSet. Все рабочие решетки вместо метода «Включить». Я нашел решение, которое создает метод расширения, который преобразует «None Filtered ObjectSet» в ObjectQuery и использует метод ObjectQuery.Include, но это решение может вызвать обход фильтрации разрешений.

public IQueryable<TEntity> Include<TJoin>(string path)
    {
        if (_nonAuthorizedObjectSet is ObjectQuery<TEntity>)
        {
            var result = ((ObjectQuery<TEntity>)_nonAuthorizedObjectSet).Include(path);
            return result as IQueryable<TEntity>;
        }
    }

Например:

Имя таблицы "Элементы" содержит столбцы {Item_Id, Owner, Item_Type_Id} В этой таблице есть логика разрешений, согласно которой пользователь может видеть только те элементы, которые Владелец == пользователь. Таблица "Item_Types" не имеет логики разрешений.

Делая: PermittedDAL. Items.ToArray () - получить только элементы, владельцем которых является current_user ==. Item_Types.Include ( "Items") Проблема !! - Я получаю все предметы.

Спасибо

1 Ответ

0 голосов
/ 04 ноября 2011

EF не поддерживает фильтрацию загруженных записей (Включить). Только основные записи могут быть отфильтрованы. Если вам нужно отфильтровать отношения, вы должны использовать собственные проекции или отдельные запросы для каждого отношения.

...