C# 动态柱上的DevForce Ideablade滤波器

C# 动态柱上的DevForce Ideablade滤波器,c#,filter,devforce,C#,Filter,Devforce,我有一个复杂的过滤器,其中一部分是: protected override Expression<Func<IHaveNoteRemarkSubject, bool>> MustFilterWhere() { if (!Model.ExactSet) return PredicateBuilder.True<IHaveNoteRemarkSubject>(); var mustPartsWhere = PredicateBuilder.True

我有一个复杂的过滤器,其中一部分是:

protected override Expression<Func<IHaveNoteRemarkSubject, bool>> MustFilterWhere()
{
    if (!Model.ExactSet) return PredicateBuilder.True<IHaveNoteRemarkSubject>();
    var mustPartsWhere = PredicateBuilder.True<IHaveNoteRemarkSubject>();

    Model.ExactFilterValue.ForEach(str => mustPartsWhere = mustPartsWhere
        .And(svi => (svi.Notes ?? string.Empty).Contains(str)));
    return mustPartsWhere;
}
受保护的重写表达式MustFilterWhere()
{
if(!Model.ExactSet)返回PredicateBuilder.True();
var mustPartsWhere=PredicateBuilder.True();
Model.ExactFilterValue.ForEach(str=>mustPartsWhere=mustPartsWhere
.And(svi=>(svi.Notes??string.Empty).Contains(str));
必须在此处返回零件;
}

我想动态指定字段(当前为“注释”)。也就是说,我将为不同的字段设置几个过滤器,这些字段需要这个精确的代码,我不想为每个字段单独重写这个逻辑。反射不起作用,因为它是在服务器端执行的。

我看到您已经在使用
PredicateBuilder
类。该类还有其他帮助器方法,可以用来实现完全动态的过滤器。下面是一个方法示例,该方法可以引入属性名称(例如“Notes”),并以这种方式构建过滤器:

private Expression<Func<IHaveNoteRemarkSubject, bool>> DynamicMustFilterWhere(IEnumerable<string> exactFilterValues, string propertyName)
{
    //Build the individual filters for each filter value
    var individualFilters =
        exactFilterValues.Select(
        //The PredicateBuilder.Make method is very handy in building dynamic filters.  In this case, we are dynamically 
        //  specifying the property name to do the Contains on
            str => PredicateBuilder.Make(typeof (IHaveNoteRemarkSubject), propertyName, FilterOperator.Contains, str));

    //AND all the individual filters together
    var combined = PredicateBuilder.And(individualFilters.ToArray<IPredicateDescription>());

    //Much of DevForce can use Predicate directly.  But if we want to end up with an Expression<Func<...>>, we can do that...

    //Have DevForce build the predicate into a lambda expression
    var lambda = combined.ToLambdaExpression();

    //Then we can cast the lambda to the Expression<Fun<...>> type
    return (Expression<Func<IHaveNoteRemarkSubject, bool>>) lambda;
}
私有表达式DynamicCustomFilterWhere(IEnumerable exactFilterValues,string propertyName)
{
//为每个过滤器值构建单独的过滤器
var独立滤波器=
ExactFilterValue。选择(
//PredicateBuilder.Make方法在构建动态过滤器时非常方便
//指定要在其上执行包含操作的属性名称
str=>PredicateBuilder.Make(typeof(IHaveNoteRemarkSubject)、propertyName、filterooperator.Contains、str));
//以及所有单独的过滤器
var combined=PredicateBuilder.And(individualFilters.ToArray());
//很多DevForce都可以直接使用谓词。但是如果我们想得到一个表达式,我们可以这样做。。。
//让DevForce将谓词构建到lambda表达式中
var lambda=combined.ToLambdaExpression();
//然后我们可以将lambda强制转换为表达式类型
返回(表达式)lambda;
}
您可能会注意到,上面的方法没有对contains字段执行任何空检查。按照DevForce执行查询的方式,即使字段为NULL,它也应该可以工作。DevForce在这方面很聪明。唯一一次(我认为)需要显式NULL逻辑的情况是,如果要将此表达式编译为可运行委托,然后以这种方式调用它。如果要这样做,只需添加一个额外的调用到
PredicateBuilder.Make
,以检查空的'propertyName'值

有关在DevForce中构建动态过滤器(甚至整个查询)的更多信息,请查看其文档,并