Переведите MethodCallExpression или вызовите его в c# - PullRequest
0 голосов
/ 27 февраля 2020

Я создал метод расширения с именем WhereIn.

public static IQueryable<TSource> WhereIn<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IEnumerable<TKey> values)
{
    if (source == null)
    {
        throw new ArgumentNullException(nameof(source));
    }

    if (keySelector == null)
    {
        throw new ArgumentNullException(nameof(keySelector));
    }

    if (values == null)
    {
        throw new ArgumentNullException(nameof(values));
    }

    if (!values.Any())
    {
        return source.Where(x => false);
    }


    var parameter = keySelector.Parameters.Single();
    var equals = values.Select(value => (Expression)Expression.Equal(keySelector.Body, Expression.Constant(value, typeof(TKey))));
    var body = equals.Aggregate((accumulate, equal) => Expression.Or(accumulate, equal));
    var lambda = Expression.Lambda<Func<TSource, bool>>(body, parameter);

    //return source.Provider.CreateQuery<TSource>(lambda);

    return source.Where(lambda);
}

Затем создал класс для посещения и перевода выражений.

protected override Expression VisitMethodCall(MethodCallExpression node)
{
    var method = node.Method;
    if (method.DeclaringType == typeof(LinqQueryableExtensions) && method.Name == nameof(LinqQueryableExtensions.WhereIn))
    {
       // What code go hear???         
    }

    return base.VisitMethodCall(node);
}

Но я не могу вызвать этот метод. Как я могу перевести или вызвать этот метод, чтобы сделать посетителем стандартного выражения?

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