是否有表达式的默认值,对它没有影响?

时间:2019-04-29 13:02:55

标签: c# lambda expression

我在我的应用程序中按某些项目进行了过滤。它可以使用表达式查询(开头为NULL)工作。

在过滤期间,有很多IF语句,这些语句检查查询是否为NULL。我需要避免重复,但是问题是我无法添加查询之类的条件。如果查询为NULL,则不能添加(exp)。

因此,在添加条件之前-查询变量必须具有值。我的第一个想法是添加条件并在应用过滤器之前将其删除,但是我无法从主体中将其删除,因为它不是字符串,并且我还没有找到这种方法。然后,我尝试添加条件,该条件告诉过滤器接受ID等于MAXINT的项目,但这不起作用,因为查询主体看起来像{p => p.ID == 2147483647还有}。不是OR,而是AND。因此,有0个项目。

            Expression<Func<Project, bool>> query = null, exp = null;

这就是现在每个IF语句中的工作方式:

            if (filter.ViewSomeProjects)
            {
                exp = p => (some conditions);
                query = query != null ? query.And(exp) : exp;                
            }

这就是我希望它如何工作:

            if (filter.ViewSomeProjects)
            {
                query.And(some conditions);                    
            }

所以我不能像我想要的那样做,而查询开头是NULL。

我的问题是:有什么方法可以删除表达主体的一部分? 是否可以在表达式中添加无用的条件,而不会影响结果?

1 个答案:

答案 0 :(得分:1)

Joe Albahari的

Predicate Builder有一个TrueFalse,您可以将其用作起点。

public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
public static Expression<Func<T, bool>> False<T> () { return f => false; }

如果您从其中之一开始,则可以根据默认行为是什么来建立查询(通常,将限制添加到默认值“所有结果”时,True可以正常工作。)