【发布时间】:2021-10-15 16:50:42
【问题描述】:
我添加了函数UserHasFilter 函数,这样我就可以过滤并查看用户是否有按照您所看到的逻辑的过滤器,但是当我运行它时会出现以下错误:
我不知道我是否使用了正确的过滤方法或有更好的方法? 我也不知道错误是怎么发生的。
这是我的代码:
public async Task<IEnumerable<ConditionDataModel>> GetUserFilters(string pageName)
{
var user = await _configurationService.GetCurrentUser();
if (user == null)
{
return null;
}
var conditions = _context.FilterUserGroups
.Include(f => f.CompanyDataRight).ThenInclude(d => d.Page)
.Include(f => f.FilterUsers).ThenInclude(d => d.User)
.Include(f => f.FilterGroups).ThenInclude(d => d.Group).ThenInclude(g => g.UserGroups).ThenInclude(ug => ug.User)
.Where(f => f.CompanyDataRight.Page.ClassName == pageName && UserHasFilter(user.Id, f))
.Include(f => f.Conditions)
.SelectMany(f => f.Conditions)
.Distinct()
.AsEnumerable();
return conditions;
}
public virtual bool UserHasFilter(Guid userId, FilterUserGroupDataModel filterUserGroup)
{
if(filterUserGroup == null)
{
return false;
}
if (filterUserGroup.FilterUsers?.Any(u => u.User.Id == userId) == true)
{
return true;
}
return false;
}
编辑:
感谢@MindSwipe,我对查询进行了更改:
var conditions = _context.FilterUserGroups
.Include(f => f.CompanyDataRight).ThenInclude(d => d.Page)
.Include(f => f.FilterUsers).ThenInclude(d => d.User)
.Include(f => f.FilterGroups).ThenInclude(d => d.Group).ThenInclude(g => g.UserGroups).ThenInclude(ug => ug.User)
.Where(f => f.CompanyDataRight.Page.ClassName == pageName
&& (f.FilterUsers != null && f.FilterUsers.Any(u => u.User.Id == user.Id) // checks if a filter user contains the current user
|| (f.FilterGroups != null && f.FilterGroups.Any(g => g.Group != null && g.Group.UserGroups.Any(ug => ug.UserId == user.Id))))) // checks if user group has the current user
.Include(f => f.Conditions)
.SelectMany(f => f.Conditions)
.Distinct()
.AsEnumerable();
因为我需要在数据库上执行查询,所以这个查询不应该花费很多时间(在内存中)。
更新:
它适用于 EF 5,他们添加了这个特定的查询。
【问题讨论】:
-
能否将错误详细信息作为文本添加到问题中,而不是作为屏幕截图?
-
因为
UserHasFilter是一个无法转换为 SQL 的 C# 函数,这就是您收到此错误的原因。 -
我无法添加文本错误,因为我输入的是非格式化代码,所以它在 stackoverflow 中出现错误
-
如错误所示,
UserHasFilter无法转换为 SQL。尝试将Where移动到.Include(f => f.Conditions)之后,否则,您将不得不重写查询的逻辑。 -
@Chetan 如何添加一个做同样事情的函数?
标签: c# entity-framework entity-framework-core ef-core-3.1