动态 Linq / EF 查询不起作用

问题描述 投票:0回答:1

我正在使用 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]' cannot be used for parameter of type 'System.Linq.IQueryable
1[Models.ChildInformation]、System.String、System.Object[]) 类型“System.Collections.Generic.List
1[Models.ChildInformation] Where[ChildInformation](System.Linq.IQueryable
1[Models.ChildInformation]”的表达式'(参数'arg0')

c# entity-framework linq hotchocolate dynamic-linq-core
1个回答
0
投票

它看起来像您面临的问题,因为错误消息表明您正在尝试在 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
© www.soinside.com 2019 - 2024. All rights reserved.