using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq.Expressions;
public static void Main()
Expression<Func<Event, bool>> searchForLogCorrelationKeyExpression = x => string.Equals(x.A, "A", StringComparison.CurrentCultureIgnoreCase);
Expression<Func<Event, bool>> searchForLsidExpressionExpression = x => string.Equals(x.B, "B", StringComparison.CurrentCultureIgnoreCase);
Expression<Func<Event, bool>> searchForLogLocationExpression = x => string.Equals(x.C, "C", StringComparison.CurrentCultureIgnoreCase);
var res = searchForLogCorrelationKeyExpression.AndAlso(searchForLsidExpressionExpression).AndAlso(searchForLogLocationExpression);
Console.WriteLine(res.Compile()(new Event(){A="A",B="B",C="C"}));
public string A {get;set;}
public string B {get;set;}
public string C {get;set;}
public static class Extensions
public static Expression<Func<T, Boolean>> AndAlso<T>(this Expression<Func<T, Boolean>> left, Expression<Func<T, Boolean>> right)
Expression<Func<T, Boolean>> combined = Expression.Lambda<Func<T, Boolean>>(
new ExpressionParameterReplacer(right.Parameters, left.Parameters).Visit(right.Body)
public class ExpressionParameterReplacer : ExpressionVisitor
private IDictionary<ParameterExpression, ParameterExpression> ParameterReplacements { get; set; }
public ExpressionParameterReplacer(IList<ParameterExpression> fromParameters, IList<ParameterExpression> toParameters)
ParameterReplacements = new Dictionary<ParameterExpression, ParameterExpression>();
for(int i = 0; i != fromParameters.Count && i != toParameters.Count; i++)
{ ParameterReplacements.Add(fromParameters[i], toParameters[i]); }
protected override Expression VisitParameter(ParameterExpression node)
ParameterExpression replacement;
if(ParameterReplacements.TryGetValue(node, out replacement))
return base.VisitParameter(node);