In C#, predicates are delegate which forms the method that defines a list of criteria and verify if the object meets those criteria.
Many times building a predicate dynamically solves many headaches to filter out the models or data. PredicateBuilder from LinqKit comes to rescue here.
PredicateBuilder extension method is as follows.
using System; using System.Linq; using System.Linq.Expressions; namespace Core { /// <summary> /// PredicateBuilder is a extension class from LINKit library /// See http://www.albahari.com/expressions for information and examples. /// </summary> 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); } } }
Here is an example use,
Expression<Func<BillingAccountReport, bool>> SearchBillingAccount(BillingAccountReportParams queryParams) { var predicate = PredicateBuilder.True<BillingAccountReport>(); if (queryParams == null) return predicate; if (queryParams.StartDate != null) { predicate = predicate.And(p => p.SubscriptionCreated >= queryParams.StartDate); } if (queryParams.EndDate != null) { predicate = predicate.And(p => p.SubscriptionCreated >= queryParams.EndDate); } if (queryParams.BillingAccountIds != null && queryParams.BillingAccountIds.Count() > 0) { foreach (string id in queryParams.BillingAccountIds) predicate = predicate.Or(p => p.Id.Contains(id)); } return predicate; }
Happy coding.
Top comments (0)