Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何计算谓词表达式_C#_.net - Fatal编程技术网

C# 如何计算谓词表达式

C# 如何计算谓词表达式,c#,.net,C#,.net,我有一个通用实体,下面是代码 private Expression<Func<GenericEntity, bool>>GetGenericEntitySearchExpression(GenericEntityParameter searchParameter) { var predicate = PredicateBuilder.True<GenericEntity>(); if (searchParameter.RegionCode == 1

我有一个通用实体,下面是代码

private Expression<Func<GenericEntity, bool>>GetGenericEntitySearchExpression(GenericEntityParameter searchParameter)
{
   var predicate = PredicateBuilder.True<GenericEntity>();
   if (searchParameter.RegionCode == 1)
   {
       predicate = predicate.And<GenericEntity>(e => e.RegionCode == searchParameter.RegionCode);
   }

   if (searchParameter.CountryCode > 0)
   {
        predicate = predicate.And<GenericEntity>(e => e.CountryCode == searchParameter.CountryCode);
   }
}

GetGenericeEntitySearchExpression返回表达式。有没有一种方法可以知道出现了多少表达式,正如您从代码中可以看到的,取决于它将附加的条件,您可以创建一个表达式访问者来计算与谓词匹配的表达式的数量:

public class Counter : ExpressionVisitor
{
    private Func<Expression, bool> predicate;
    public int Count { get; private set; }
    public Counter(Func<Expression, bool> predicate)
    {
        this.predicate = predicate;
    }
    public override Expression Visit(Expression node)
    {
        if (predicate(node))
            Count++;
        return base.Visit(node);
    }
}

public static int Count(
    this Expression expression, 
    Func<Expression, bool> predicate)
{
    var counter = new Counter(predicate);
    counter.Visit(expression);
    return counter.Count;
}

谢谢@servy的提示。我使用了泛型类而不是继承。可能有比下面提到的代码更好的方法

private ExpressionWithCounter<GenericEntity> GetGenericEntitySearchExpression(GenericEntityParameter searchParameter)
{
    var expressionCounter = new ExpressionWithCounter<GenericEntity>();
    expressionCounter.Predicate = PredicateBuilder.True<GenericEntity>();

    if (searchParameter.RegionCode == 1)
    {
    expressionCounter.Append(expressionCounter.Predicate.And<GenericEntity>(e => e.RegionCode == searchParameter.RegionCode));
    }

    if (searchParameter.CountryCode > 0)
    {
        expressionCounter.Append(expressionCounter.Predicate.And<GenericEntity>(e => e.CountryCode == searchParameter.CountryCode));
    }
}


public class ExpressionWithCounter<T>
{
    public Expression<Func<T, bool>> Predicate;
    public int Count { get; private set; }

    public void Append(Expression<Func<T, bool>> expression)
    {
        Predicate = expression;
        Count++;
    }
}


ExpressionWithCounter<GenericEntity> whereExperssion = GetGenericEntitySearchExpression(searchParameter);

//Is Any expression added?
if(whereExperssion.Count > 0)
{
    //Perform any action
}

如果您要修改方法本身的源代码,那么实际上不需要所有这些复杂性,只要在添加新条件时增加一个计数器即可。我的实际代码中有将近20个IF-ELSE条件,所以我发现这种处理方式更好。我的解决方案可能不是最好的,但它解决了我的问题,如果有一大堆条件反对完全使用这种方法。我的方法根本不需要对方法进行任何操作,不需要任何更新。也就是说;我不认为调用您的这个方法比添加一个count++要少多少工作量;每个街区都有一条线。
private ExpressionWithCounter<GenericEntity> GetGenericEntitySearchExpression(GenericEntityParameter searchParameter)
{
    var expressionCounter = new ExpressionWithCounter<GenericEntity>();
    expressionCounter.Predicate = PredicateBuilder.True<GenericEntity>();

    if (searchParameter.RegionCode == 1)
    {
    expressionCounter.Append(expressionCounter.Predicate.And<GenericEntity>(e => e.RegionCode == searchParameter.RegionCode));
    }

    if (searchParameter.CountryCode > 0)
    {
        expressionCounter.Append(expressionCounter.Predicate.And<GenericEntity>(e => e.CountryCode == searchParameter.CountryCode));
    }
}


public class ExpressionWithCounter<T>
{
    public Expression<Func<T, bool>> Predicate;
    public int Count { get; private set; }

    public void Append(Expression<Func<T, bool>> expression)
    {
        Predicate = expression;
        Count++;
    }
}


ExpressionWithCounter<GenericEntity> whereExperssion = GetGenericEntitySearchExpression(searchParameter);

//Is Any expression added?
if(whereExperssion.Count > 0)
{
    //Perform any action
}