Entity Framework имеет набор универсальных c инструментов для вызова таблицы с TEntityType
. Я предполагаю, что самая сложная часть - это динамическое построение фильтров с учетом входных данных от внешнего интерфейса.
Со стороны сервера
Что вы можете искать (со стороны сервера) это способ динамически создавать лямбда-выражения, например:
string myFilterString = "entity => entity.EntityProperty > 100";
Predicate<MyEntity> myFilterPredicate = MyPredicateFactory.BuildFromString<MyEntity>(myFilterString);
var filteredEntities = context.Set<MyEntity>().Where(myFilterPredicate).ToList();
И вы получите filterString
с фронта, который будет нести ответственность за его сборку с помощью пользовательского интерфейса, которого он заслуживает.
Это выполнимо, давайте проверим эту статью на простом примере. Вы можете использовать отражение для построения выражений любого типа. https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/
На внешней стороне
Чтобы всегда не поддерживать синхронизацию c переднюю часть и внутреннюю часть, при каждом изменении внутренней части (свойство переименовывается например), то, что я предлагаю, это динамически построить (на стороне сервера) схему json пригодных для использования фильтруемых объектов и свойств и отправить ее на фронт так или иначе, чтобы, когда фронт получает ее, она знает, какие имена сущностей или свойств можно использовать для создания строковых фильтров.
Таким образом, вы можете переименовывать или добавлять свойства в конец, не беспокоясь о совместимости внешнего интерфейса. Ваш фронт мог бы просто манипулировать новыми свойствами.
Необязательно: другие интересные треки
Если вы не знаете API-интерфейсы GraphQL, вам может быть интересно проверить, сколько это стоит, поскольку с небольшим количеством конфигурации и кода, он поддерживает фильтрацию на стороне клиента.