如何构建表达式以将 Where 子句一般应用于 IQueryable<T>?

How do I build an expression to apply a Where clause generically to an IQueryable<T>?

我有一个名为 TestObject 的 class,带有 Name 参数。

我创建了一个列表并添加了其中的 2 个。我想为任何 IQueryable<T>.

创建一个通用的 Where() 子句方法

我一直在玩弄表达式,但我真的不知道自己在做什么。

我用一些硬编码的值创建了这个方法用于测试,我希望它做 collection.Where(c => c.Name == "Boris"):

public static IQueryable<T> Apply<T>(IQueryable<T> collection)
{
    var parameterName = "Name";
    var searchValue = "Boris";

    var selectorParameter = Expression.Parameter(typeof(T), parameterName);
    var searchTermExpression = Expression.Constant(searchValue);    
    var checkEqualsExpression = Expression.Call(selectorParameter, typeof(string).GetMethod("Equals"), searchTermExpression);

var methodCallExpression = Expression.Call(typeof(Queryable),
    "Where",
    new Type[] { collection.ElementType },
    collection.Expression,
    Expression.Lambda<Func<T, bool>>(checkEqualsExpression , ?????));

    return collection.Provider.CreateQuery<T>(methodCallExpression);
}

我不确定 ????? 中的内容,甚至不确定这是否正确。谁能给点建议?

这是一个如何做的例子,带有注释,它应该澄清你做错了什么。

public static IQueryable<T> Apply<T>(IQueryable<T> collection) {
    var propertyName = "Name";
    var searchValue = "Boris";
    // we have parameter "c"
    var selectorParameter = Expression.Parameter(typeof(T), "c");
    // constant "Boris"
    var searchTermExpression = Expression.Constant(searchValue);
    // "c.Name"
    var selector = Expression.PropertyOrField(selectorParameter, propertyName);
    // "c.Name == "Boris"
    var equal = Expression.Equal(selector, searchTermExpression);
    // c => c.Name == "Boris"
    var where = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
    return collection.Where(where);
}