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
}