0

假设我有这个函数可以向我的查询添加一个简单的过滤器:

    public static IQueryable<MyType> FilterSpecificParam(this IQueryable<MyType> query, string param)
    {

        var req = query.Where(c =>
            (!(param == null || param.Trim() == "") && c.SpecificColumn.StartsWith(param))
                   || ((param == null || param.Trim() == "")));

        return req;
    }

我会这样使用它:

SomeQueryOnMyTable.FilterSpecificParam(MyFilter)

现在,我不想为我要设置的每个过滤器重复这样的功能!所以,我发现我可以这样写我的查询:

SomeQueryOnMyTable.FilterGenericParam(MyFilter, c => c.TheColumnIWantToTest))

我的函数有这个原型:

        public static IQueryable<MyType> Filter(this IQueryable<MyType> query, string param, Func<MyType, string> predicate)

问题: 我无法掌握该列的值:

        public static IQueryable<MyType> Filter(this IQueryable<MyType> query, string param, Func<MyType, string> predicate)
    {

        var req = query.Where(c =>
            (!(param == null || param.Trim() == "") && predicate.Invoke(What???).StartsWith(param))
                   || ((param == null || param.Trim() == "")));

        return req;
    }

注意上面代码中的predicate.Invoke:它要求一个MyType类型的参数。

我希望它采用前面查询(SomeQueryOnMyTable)的参数,但我不知道如何做到这一点......知道吗?

编辑:也许有更好的方法来做这个通用过滤器功能,我最终会接受它作为答案

4

1 回答 1

0

你想使用predicate(c)because cis of type MyType,像这样:

public static IQueryable<MyType> Filter(this IQueryable<MyType> query, string param, Func<MyType, string> predicate)
{
    var req = query.Where(c =>
        (!(param == null || param.Trim() == "") && predicate(c).StartsWith(param))
            || ((param == null || param.Trim() == "")));

    return req;
}
于 2013-07-21T02:05:55.073 回答