Я создал метод расширения с именем 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);
}
Но я не могу вызвать этот метод. Как я могу перевести или вызвать этот метод, чтобы сделать посетителем стандартного выражения?