我在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照片。我做错了吗?
也就是说,因为您根本没有对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);
}