2
\$\begingroup\$

I have created this method to simulate SQL's IN operator:

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)));

to use it like:

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

I think there's no problem with it since it's working on the in-memory data.

and this is the IQueryable version of it:

    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;
        }

I'd like to know if this is how IQueryable methods are implemented? did I use the Expressions API right? and is there a better suggestion than using Reflection, or it's OK?

\$\endgroup\$
  • \$\begingroup\$ I have created this method - to do what? You need to explain what you did in more words. \$\endgroup\$ – t3chb0t Mar 14 '18 at 7:27
  • \$\begingroup\$ amended the question \$\endgroup\$ – mshwf Mar 14 '18 at 7:33
  • \$\begingroup\$ If you look at the C# Reference Source for Queryable you'll see they use an interesting compile time generic method named GetMethodInfo to retrieve the appropriate method. \$\endgroup\$ – NetMage Apr 2 '18 at 21:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.