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)