How can I simplify Linq extension method invokation using reflection?
===

**Background:**

I have a web service that returns the rows in a table (table name supplied as a parameter) with Ids greater than a certain Id (also supplied as a parameter). We are assuming the Ids are sequential.

I am using Linq to SQL for database interaction so I want to return the new rows as a List<WhateverObject>. Because we only know the table name at runtime, I can't use Linq in a normal fashion which has made things much more complex.

**Question:**

The code is below (and it works). How can I simplify it? It seems overly complex.

<!-- language: lang-cs -->

    private object GetUpdateList(string tableName, int Id, DataClassesDataContext db)
    {
        PropertyInfo pi = db.GetType().GetProperty(tableName);

        var table = pi.GetValue(db, null);

        // Get type of object within the table.
        Type genericType = table.GetType().GetGenericArguments()[0];

        // The Where method lives on the Enumerable type in System.Linq
        var whereMethods = typeof(System.Linq.Enumerable)
            .GetMethods(BindingFlags.Static | BindingFlags.Public)
            .Where(mi => mi.Name == "Where");

        // There are actually 2 where methods - we want the one with 2 parameters
        MethodInfo whereMethod = null;
        foreach (var methodInfo in whereMethods)
        {
            var paramType = methodInfo.GetParameters()[1].ParameterType;
            if (paramType.GetGenericArguments().Count() == 2)
            {
                // we are looking for  Func<TSource, bool>, the other has 3
                whereMethod = methodInfo;
                break;
            }
        }

        Func<object, bool> IdEquals = BuildEqFuncFor("Id", Id);

        whereMethod = whereMethod.MakeGenericMethod(genericType);
        var result = whereMethod.Invoke(table, new object[] { table, IdEquals });

        MethodInfo toListMethod = typeof(System.Linq.Enumerable).GetMethod("ToList").MakeGenericMethod(genericType);
        return toListMethod.Invoke(result, new object[] { result });
    }

    // Build lambda expression for use in Linq
    private static Func<object, bool> BuildEqFuncFor(string prop, object val)
    {
        // We know we are comparing integers here so cast them.
        // There is probably a more general solution.
        return t => (int)t.GetType().InvokeMember(prop, BindingFlags.GetProperty, null, t, null) > (int)val;
    }

To come up with this solution I have had to reference the following questions:

- http://stackoverflow.com/questions/1452261/how-do-i-invoke-an-extension-method-using-reflection
- http://stackoverflow.com/questions/1948506/how-to-call-extension-method-elementatof-listt-with-reflection
- http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t
- http://stackoverflow.com/questions/3495243/convert-func-to-predicate-using-reflection-in-c-sharp