Реализация метода интерфейса IQueryable аналог метода интерфейс IEnumerable?


Я создал этот метод, чтобы моделировать в SQL IN оператор:

public static IEnumerable<TSource> In<TSource, TMember>(this IEnumerable<TSource> source,
            Func<TSource, TMember> identifier, params TMember[] values) =>
         source.Where(m => values.Contains(identifier(m)));

чтобы использовать его как:

var selectedAccounts = allAccounts.In(x => x.Id, 1, 2, 100); //select accounts whose Id's are 1, 2, 100

Я думаю, нет никаких проблем с ним, так как он работает на данных в памяти.

и это IQueryable версия:

    public static IQueryable<TSource> In<TSource, TMember>(this IQueryable<TSource> source,
   Expression<Func<TSource, TMember>> identifier, params TMember[] values)
        {
            var parameter = Expression.Parameter(typeof(TSource), "m");
            var inExpression = GetExpression(parameter, identifier, values);
            var theExpression = Expression.Lambda<Func<TSource, bool>>(inExpression, parameter);
            return source.Where(theExpression);
        }

  static Expression GetExpression<TSource, TMember>(ParameterExpression parameter, Expression<Func<TSource, TMember>> identifier, IEnumerable<TMember> values)
        {
            var memberName = (identifier.Body as MemberExpression).Member.Name;
            var member = Expression.Property(parameter, memberName);
            var valuesConstant = Expression.Constant(values.ToList());
            MethodInfo method = typeof(List<TMember>).GetMethod("Contains");
            Expression call = Expression.Call(valuesConstant, method, member);
            return call;
        }

Я хотел бы знать, если это как IQueryable методы реализуются? я использовал выражения API в порядке? и есть предложение получше, чем с помощью отражения, или это нормально?



145
2
задан 13 марта 2018 в 09:03 Источник Поделиться
Комментарии