В C #, как я могу добавить нулевую проверку в динамический экспресс-код - PullRequest
2 голосов
/ 10 апреля 2011

я использую этот проект для использования jqgrid для фильтрации и сортировки коллекций .Единственная проблема, которую я вижу, если при циклическом просмотре коллекции и проверке свойства строкового поля значение null будет взорвано, приведенный ниже код.я хочу настроить код ниже, чтобы он создал лямбду, которая не только выполняет "ToString ()" и "Contains", но также поддерживает, если свойство имеет значение null (и обрабатывает его как string.empty)

Iв основном есть 2 входа в эту функцию ниже:

  1. FieldName
  2. Значение данных

, и код ниже динамически создает выражение для цикла черезсбор и проверка «Содержит» для свойства, которое отображается на передаваемое имя FieldName.

у меня есть код, который выглядит следующим образом:

        ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");

        MemberExpression memberAccess = null;
        MethodCallExpression memberAccessToString = null;
        foreach (var property in column.Split('.'))
        {
            memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
            memberAccessToString = MemberExpression.Call(memberAccess, "ToString", new Type[] {}, new Expression[] {});
        }

        Expression condition = null;
        LambdaExpression lambda = null;
            case WhereOperation.Contains:
                condition = Expression.Call(memberAccessToString,
                    typeof(string).GetMethod("Contains"),
                    Expression.Constant(value));
                lambda = Expression.Lambda(condition, parameter);

        MethodCallExpression result = Expression.Call(
               typeof(Queryable), "Where",
               new[] { query.ElementType },
               query.Expression,
               lambda);

        return query.Provider.CreateQuery<T>(result);

1 Ответ

1 голос
/ 10 апреля 2011

Вы проверили Expression.Coalesce, можете ли вы применить его к memberAccess перед вызовом ToString ()

memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
memberAccessToString = MemberExpression.Call(Expression.Coalesce(memberAccess,Expression.Constant(string.Empty)), "ToString", new Type new Type[] {}, new Expression[] {});

Не тестировал его, но может привести к решению

...