IgnoreQueryFilters 不会忽略布尔值上的过滤器
IgnoreQueryFilters does not ignore filters on a boolean
我在 DbContext 中对照片使用全局过滤器。每张照片都有一个 属性 叫做 isApproved,如果照片没有被批准应该等于 false。
所以在 OnModelCreating 方法中,我设置了一个这样的全局过滤器
builder.Entity<Photo>().HasQueryFilter(p => p.IsApproved);
然后它按预期工作,returns 一切都是真的。
但是,对于当前登录的用户,我希望用户能够看到照片,即使它们处于批准状态。然后我将 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;
}
当我检索用户时,即使我忽略了登录用户的规则,我仍然看不到未批准的照片。我做错了什么?
也就是说,因为您根本没有对 query
做任何事情,而是定义了第二个 user
对象,它忽略了您的 query
。结果是,用户变量在启用全局过滤器的情况下对您的数据存储执行查询。
简而言之:您必须执行查询并 return 它。不需要单独的用户对象。因此,您可以简单地将 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);
}
我在 DbContext 中对照片使用全局过滤器。每张照片都有一个 属性 叫做 isApproved,如果照片没有被批准应该等于 false。
所以在 OnModelCreating 方法中,我设置了一个这样的全局过滤器
builder.Entity<Photo>().HasQueryFilter(p => p.IsApproved);
然后它按预期工作,returns 一切都是真的。 但是,对于当前登录的用户,我希望用户能够看到照片,即使它们处于批准状态。然后我将 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;
}
当我检索用户时,即使我忽略了登录用户的规则,我仍然看不到未批准的照片。我做错了什么?
也就是说,因为您根本没有对 query
做任何事情,而是定义了第二个 user
对象,它忽略了您的 query
。结果是,用户变量在启用全局过滤器的情况下对您的数据存储执行查询。
简而言之:您必须执行查询并 return 它。不需要单独的用户对象。因此,您可以简单地将 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);
}