Написать динамический фильтр для Entity Framework Core - PullRequest
0 голосов
/ 28 марта 2019

Я пишу небольшой проект, использующий .net Core и Entity Framework.

Мне нужен динамический фильтр для IQueryable<T>.

У меня есть перечисления, которые определяют операторы

public enum QueryOperatorEnums
{
   Equal = 0,
   NotEqual = 1,
   Constant = 2,
   LessThan = 3,
   GreaterThan = 4,
   LessThanOrEqual = 5,
   GreaterThanOrEqual = 6,
}  

И у меня есть расширения IQueryable:

public static IQueryable<T> Filter<T>(this IQueryable<T> query, Dictionary<string, KeyValuePair<QueryOperatorEnums, object>> keyValuePairs)
{
    if (keyValuePairs == null)
        return query;

    foreach (var keyValuePair in keyValuePairs)
    {
        var propertyInfo = typeof(T).GetProperty(keyValuePair.Key);

        if (propertyInfo != null)
        {
            var operation = keyValuePair.Value;

            switch (operation.Key)
            {
                case QueryOperatorEnums.Constant:
                    break;

                case QueryOperatorEnums.Equal:
                    query = query.Where(obj => propertyInfo.GetValue(obj, null).Equals(operation.Value));
                    break;

                case QueryOperatorEnums.GreaterThan:
                    break;

                case QueryOperatorEnums.GreaterThanOrEqual:
                    break;

                case QueryOperatorEnums.LessThan:
                    break;

                case QueryOperatorEnums.LessThanOrEqual:
                    break;

                case QueryOperatorEnums.NotEqual:
                   break;

                default:
                    break;
            }
        }
    }

    return query;

}

Что я могу сделать, чтобы реализовать для особых случаев?Потому что значение свойства является динамическим во время выполнения.Я не могу определить тип для использования <=, >= ...

Спасибо за вашу поддержку

1 Ответ

1 голос
/ 28 марта 2019

Как вы уже видели, вы не можете использовать отражение.

Однако, 2 сторонние библиотеки могут помочь вам с этим

LINQ Dynamic

https://www.nuget.org/packages/System.Linq.Dynamic.Core/

Необходимый синтаксис немного отличается от C #, но отлично работает. Это самая популярная библиотека для подобных вещей.


C # Eval Expression

Отказ от ответственности : я владелец проекта C # Eval Expression

Библиотека не является бесплатной, но вы можете создать практически любой динамический LINQ, используя тот же синтаксис, что и в C #.

Таким образом, вы сможете создать строку для оценки, а библиотека сделает все остальное за вас.

Вот несколько примеров использования EF Classic:

Работает ли Dynamic linq с MySql, Sql Server и Postgresql, Jonathan?

Да, я не понимаю, почему это не могло работать. Под капотом генерируется выражение LINQ, которое вы можете вызвать вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...