IgnoreQueryFilters не игнорирует фильтры на логическом - PullRequest
0 голосов
/ 15 марта 2020

Я использую глобальные фильтры на фотографиях в DbContext. Каждое фото имеет свойство isApproved, если оно не одобрено, оно должно быть равно false.

Итак, в методе OnModelCreating я установил глобальный фильтр, подобный этому

builder.Entity<Photo>().HasQueryFilter(p => p.IsApproved);

И затем он работает, как и ожидалось, возвращает все, что верно. Тем не менее, для текущего пользователя, который вошел в систему, я хочу, чтобы пользователь мог видеть фотографии, даже если они находятся в состоянии одобрения. И я применяю IgnoreFilter к репозиторию следующим образом:

public async Task<User> GetUser(int id, bool isCurrentUser)
    {
        var query = _context.Users.Include(p => p.Photos).AsQueryable();

        if (isCurrentUser)
        {
            // For current user the global filter is dissabled
            query = query.IgnoreQueryFilters();
        }

        // When retrieve the user, we retrieve his photos as well.
        var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id);

        // returning default means null if the user doesn`t matches his id
        return user;
    }

Когда я получаю пользователя, я все еще не вижу неутвержденные фотографии w, даже если я игнорирую правило для вошедшего в систему пользователя. Что я делаю не так?

1 Ответ

3 голосов
/ 15 марта 2020

То есть, потому что вы просто ничего не делаете со своим query, а вместо этого определяете второй user объект, который игнорирует ваш query. В результате пользовательская переменная выполняет запрос к вашему хранилищу данных с включенными глобальными фильтрами.

Короче говоря: вам нужно выполнить запрос и вернуть его. Нет необходимости в отдельном пользовательском объекте. Так что либо вы просто изменяете объект user на: var user = await query.FirstOrDefaultAsync(u => u.Id == id);, либо, когда вы хотите сделать это более кратким и коротким:

public async Task<User> GetUser(int id, bool isCurrentUser)
{
    var query = _context.Users.Include(p => p.Photos).AsQueryable();

    if (isCurrentUser)
    {
        // For current user the global filter is dissabled
        query = query.IgnoreQueryFilters();
    }

    return await query.FirstOrDefaultAsync(u => u.Id == id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...