首页 > 解决方案 > IgnoreQueryFilters 不会忽略布尔值上的过滤器

问题描述

我在 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 照片。我做错了什么?

标签: c#entity-framework.net-coreentity-framework-coredbcontext

解决方案


也就是说,因为您根本没有对您的 . 做任何事情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);
}

推荐阅读