Skip to content

Instantly share code, notes, and snippets.

@badsyntax
Last active March 3, 2023 17:43
Show Gist options
  • Save badsyntax/e6ff47577bde63dc0ef377783c6a4731 to your computer and use it in GitHub Desktop.
Save badsyntax/e6ff47577bde63dc0ef377783c6a4731 to your computer and use it in GitHub Desktop.
c# predicate builder, useful for constructing linq predicates
internal class ExpressionWhereFinder : ExpressionVisitor
{
private readonly IList<MethodCallExpression> _whereExpressions = new List<MethodCallExpression>();
public IEnumerable<MethodCallExpression> GetWhere(Expression expression)
{
Visit(expression);
return _whereExpressions;
}
protected override Expression VisitMethodCall(MethodCallExpression expression)
{
if (expression.Method.Name == "Where")
{
_whereExpressions.Add(expression);
}
Visit(expression.Arguments[0]);
return expression;
}
}
namespace MyApp.Linq
{
using System;
using System.Linq;
using System.Linq.Expressions;
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T>()
{
return f => true;
}
public static Expression<Func<T, bool>> False<T>()
{
return f => false;
}
public static Expression<Func<T, bool>> Or<T>(
this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2
)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(
this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2
)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment