GetExpression Method C# with Example
public static Expression> GetExpression(IList filters) { Expression exp = null; // Represents a named parameter expression. {parm => parm.Name.Equals()}, it is the param part // To create a ParameterExpression need the type of the entity that the query is against an a name // The type is possible to find with the generic T and the name is fixed parm ParameterExpression param = Expression.Parameter(typeof(T), "parm"); // It is good parctice never trust in the client, so it is wise to validate. if (filters.Count == 0) return null; // The expression creation differ if there is one, two or more filters. if (filters.Count != 1) { if (filters.Count == 2) // It is result from direct call. // For simplicity sake the private overloads will be explained in another example. exp = GetExpression(param, filters[0], filters[1]); else { // As there is no method for more than two filters, // I iterate through all the filters and put I in the query two at a time while (filters.Count > 0) { // Retrieve the first two filters var f1 = filters[0]; var f2 = filters[1]; // To build a expression with a conditional AND operation that evaluates // the second operand only if the first operand evaluates to true. // It needed to use the BinaryExpression a Expression derived class // That has the AndAlso method that join two expression together exp = exp == null ? GetExpression(param, filters[0], filters[1]) : Expression.AndAlso(exp, GetExpression(param, filters[0], filters[1])); // Remove the two just used filters, for the method in the next iteration finds the next filters filters.Remove(f1); filters.Remove(f2); // If it is that last filter, add the last one and remove it if (filters.Count == 1) { exp = Expression.AndAlso(exp, GetExpression(param, filters[0])); filters.RemoveAt(0); } } } } else // It is result from direct call. exp = GetExpression(param, filters[0]); // converts the Expression into Lambda and retuns the query return Expression.Lambda>(exp, param); }