Dynamic Linq/EF, где запрос не работаетC#

Место общения программистов C#
Гость
Dynamic Linq/EF, где запрос не работает

Сообщение Гость »

Я работаю с 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
 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.Collections.Generic.List

Код: Выделить всё

1[Models.ChildInformation]' cannot be used for parameter of type 'System.Linq.IQueryable
1[Models.ChildInformation]» метода «System.Linq.IQueryable»

Код: Выделить всё

1[Models.ChildInformation] Where[ChildInformation](System.Linq.IQueryable
1[Models.ChildInformation], System.String, System.Object[])' (параметр 'arg0')


Подробнее здесь: https://stackoverflow.com/questions/782 ... ot-working

Вернуться в «C#»