c# - 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 照片。我做错了什么?
解决方案
也就是说,因为您根本没有对您的 . 做任何事情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);
}
推荐阅读
- sql - 带有来自“SELECT”中另一个表的子查询的 Oracle 查询
- python - 提供的参数“file_obj”似乎不是有效的 hickle 文件(python 版本 3.6.9 中的 Hickle)
- c# - cshtml 中的 .NET ASP MVC for/foreach 无法正确生成 html
- java - 我不知道如何在 Java 中使用十进制格式
- javascript - 不和谐.js | 回复消息(实际回复带有回复装饰)
- html - SASS 将 -ms 前缀添加到 css 网格,但它在 IE 中不起作用
- javascript - 如何在zapier中重用javascript函数
- php - 我的 Mysqli 代码没有在我的数据库中插入数据
- python - 从 Python 中的输入创建字典
- java - 首次构建时的 Android (Java) 应用程序错误“找不到 kotlin-stdlib-jdk7-1.3.72.jar”