我正在使用 GraphQL、HotChocolate、API 和 EF,我们可以在其中获取某些信息。为了授权用户访问此信息,我们首先从数据库中检索一个拥有用户权限的实体,例如:
public class Permissions
{
public int InformationId { get; set; }
public bool View { get; set; }
public bool ViewSecret{ get; set; }
}
首先我们在基础查询上加入了权限查询,根据你的权限来过滤你获取的信息,然而这在性能方面非常糟糕,这就是为什么我们决定首先进行权限查询,然后在第二个查询我们根据权限过滤结果,例如:
var result = _dbContext.Information
.Where(workingQueryFilter)
.Select(x => new Information
{
Name = x.Name
ChildInformation = x.ChildInformation
.AsQueryable()
.Where(notWorkingQueryFilter).ToList()
});
对于第一个
.Where(QueryFilter)
,我们使用动态 linq 包,将过滤器构建为字符串,例如:
var workingQueryFilter = Filter(ListOfPermissions);
public static string Filter(List<Permissions> permission)
{
var expression = "i => i.IsDeleted == false"
for (var i = 0; i < permission.Count; i++)
{
expression += $"i.InformationId == {permission[i].InformationId} && {information[i].View}"
}
return expression;
}
这个效果很好。
但是,当我们想要过滤
ChildInformation
时,我收到此错误消息:
方法“System.Linq.IQueryable
1[Models.ChildInformation]、System.String、System.Object[]) 类型“System.Collections.Generic.List1[Models.ChildInformation]' cannot be used for parameter of type 'System.Linq.IQueryable
1[Models.ChildInformation]”的表达式'(参数'arg0')1[Models.ChildInformation] Where[ChildInformation](System.Linq.IQueryable
它看起来像您面临的问题,因为错误消息表明您正在尝试在 List<T>
上使用LINQ
查询后尝试使用
.ToList
:
var result = _dbContext.Information
.Where(workingQueryFilter) // This is fine since it's operating on IQueryable
.Select(x => new Information
{
Name = x.Name,
ChildInformation = x.ChildInformation
.AsQueryable() // Ensure this is IQueryable
.Where(dynamicChildFilter) // Apply dynamic filter here
// Do not call .ToList() here
})
.ToList(); // Convert to list after query is finished