Целое число содержит linq c #, но с использованием выражений - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу создать динамический фильтр для своих репозиториев, используя выражения linq, у меня есть другие фильтры, но я не знаю, как создать следующий, используя выражения: (условие взято из здесь )

var result = _studentRepotory.GetAll().Where(s => 
SqlFunctions.StringConvert((double)s.Id).Contains("91")).ToList();

У меня есть метод, который получает значение свойства, propertyName и тип оператора фильтра (enum):

public static class Helper {
    public static Expression<Func<T, bool>> GetExpression<T>(object value, string propertyName, FilterOperatorType FilterType)
    {
        var parameter = Expression.Parameter(typeof(T));
        var property = ExpressionUtils.GetPropertyChild(parameter, propertyName);
        var constValue = Expression.Constant(value);

        BinaryExpression expresion = null;
        switch (FilterType)
        {
            case FilterOperatorType.Equal:
                expresion = Expression.Equal(property, constValue);
                break;
            case FilterOperatorType.Greater:
                expresion = Expression.GreaterThan(property, constValue);
                break;
            case FilterOperatorType.Less:
                expresion = Expression.LessThan(property, constValue);
                break;
            case FilterOperatorType.GreaterOrEqual:
                expresion = Expression.GreaterThanOrEqual(property, constValue);
                break;
            case FilterOperatorType.LessOrEqual:
                expresion = Expression.LessThanOrEqual(property, constValue);
                break;
        }

        var lambda = Expression.Lambda<Func<T, bool>>(expresion, parameter);
        return lambda;
    }
}

Итак, я хочу добавить новый оператортип Содержит , который оценивает, содержит ли целое число несколько цифр, в первом блоке кода, который я делаю, но я хочу сделать это с помощью выражений linq, используя обобщенные значения.

В конце ябудет иметь:

Expression<Func<Student, bool>> where = Helper.GetExpression<Student>("91", "Id",  FilterOperatorType.Contains);
var result = _studentRepotory.GetAll().Where(where).ToList();

Запрос должен возвращать всех студентов, когда Id содержит цифры 91.

Пожалуйста, помогите мне и скажите, если вы понимаете.

1 Ответ

0 голосов
/ 16 ноября 2018

Я в 2 часа ночи и все еще работаю над этим, мозг работает лучше, хе-хе, вот решение для создания выражения:

object value = "91";

var parameter = Expression.Parameter(typeof(Student));
var property = ExpressionUtils.GetPropertyChild(parameter, "Id");
var constValue = Expression.Constant(value);

var expressionConvert = Expression.Convert(property, typeof(double?));

var methodStringConvert = typeof(SqlFunctions).GetMethod("StringConvert",
                    BindingFlags.Public | BindingFlags.Static, null,
                    CallingConventions.Any,
                    new Type[] { typeof(double?) },
                    null);

var methodContains = typeof(string).GetMethod("Contains", 
            BindingFlags.Public | BindingFlags.Instance,
            null, CallingConventions.Any,
            new Type[] { typeof(String) }, null);

var expresionStringConvert = Expression.Call(methodStringConvert, expressionConvert);
var expresionContains = Expression.Call(expresionStringConvert, methodContains, constValue);
var lambdaContains = Expression.Lambda<Func<Student, bool>>(expresionContains, parameter);

Теперь вы можете использовать lambdaContains в методе Where студенческого репозитория

...