Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You can use the <a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx" rel="nofollow"><code>System.Linq.Expressions</code> namespace</a> to build an expression by hand. For the two examples you've posted, the following should work:</p> <pre><code>public static Expression&lt;Func&lt;T, bool&gt;&gt; StringEquals&lt;T&gt;(Expression&lt;Func&lt;T, string&gt;&gt; leftOperand, Expression&lt;Func&lt;T, string&gt;&gt; rightOperand) { var p = leftOperand.Parameters[0]; var leftOperandBody = leftOperand.Body; var rightOperandBody = ReplacementVisitor.Transform(rightOperand, rightOperand.Parameters[0], p); var isNullOrEmptyMethod = typeof(string).GetMethod("IsNullOrEmpty"); var leftNullOrEmpty = Expression.Call(isNullOrEmptyMethod, leftOperandBody); var rightNullOrEmpty = Expression.Call(isNullOrEmptyMethod, rightOperandBody); var bothNullOrEmpty = Expression.AndAlso(leftNullOrEmpty, rightNullOrEmpty); var areEqual = Expression.Equal(leftOperandBody, rightOperandBody); var body = Expression.OrElse(bothNullOrEmpty, areEqual); return Expression.Lambda&lt;Func&lt;T, bool&gt;&gt;(body, p); } public static Expression&lt;Func&lt;T, bool&gt;&gt; DatesActive&lt;T&gt;(Expression&lt;Func&lt;T, DateTime&gt;&gt; startDate, Expression&lt;Func&lt;T, DateTime&gt;&gt; endDate) { var p = startDate.Parameters[0]; var startDateBody = startDate.Body; var endDateBody = ReplacementVisitor.Transform(endDate, endDate.Parameters[0], p); var nowProperty = typeof(DateTime).GetProperty("Now"); var nowValue = Expression.Property(null, nowProperty); var startValid = Expression.GreaterThanOrEqual(startDateBody, nowValue); var endValid = Expression.LessThanOrEqual(endDateBody, nowValue); var body = Expression.AndAlso(startValid, endValid); return Expression.Lambda&lt;Func&lt;T, bool&gt;&gt;(body, p); } internal sealed class ReplacementVisitor : ExpressionVisitor { private IList&lt;ParameterExpression&gt; SourceParameters { get; set; } private Expression Find { get; set; } private Expression Replace { get; set; } public static Expression Transform(LambdaExpression source, Expression find, Expression replace) { var visitor = new ReplacementVisitor { SourceParameters = source.Parameters, Find = find, Replace = replace, }; return visitor.Visit(source.Body); } private Expression ReplaceNode(Expression node) { return (node == Find) ? Replace : node; } protected override Expression VisitConstant(ConstantExpression node) { return ReplaceNode(node); } protected override Expression VisitBinary(BinaryExpression node) { var result = ReplaceNode(node); if (result == node) result = base.VisitBinary(node); return result; } protected override Expression VisitParameter(ParameterExpression node) { if (SourceParameters.Contains(node)) return ReplaceNode(node); return SourceParameters.FirstOrDefault(p =&gt; p.Name == node.Name) ?? node; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload