IgnoreQueryFilters不会忽略布尔值上的过滤器

问题描述 投票:1回答:1

我在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-core entity-framework-core dbcontext
1个回答
3
投票

也就是说,因为您根本没有对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);
}
© www.soinside.com 2019 - 2024. All rights reserved.