Example #1
0
 /// <summary>
 /// Compile the single item if it is possible to compile.
 /// It concerns those <see cref="ExpressionPart"/>s items which returns expression in <seealso cref="ExpressionPart.GetExpression(EvaluationContext, string, ref ExpressionData)"/>.
 /// </summary>
 /// <param name="context">The context of evaluation.</param>
 /// <param name="expressionTree">The expression tree.</param>
 protected virtual bool CompileSingleItem(EvaluationContext context, IList <ProcessedItem> expressionTree)
 {
     // compile single item
     return(ReverseLoop(expressionTree, i =>
     {
         ProcessedItem item = expressionTree[i];
         if (item.ItemType != null)
         {
             IExpressionPart obj = GetObject(item.ItemType);
             ExpressionData data = new ExpressionData();
             Expression compiled = obj.GetExpression(context, item.Content, ref data);
             if (compiled != null)
             {
                 ProcessedItem newItem = ProcessedItem.Create(compiled);
                 expressionTree.RemoveAt(i);
                 expressionTree.Insert(i, newItem);
                 return true;
             }
             else if (data.TypeToCast != null)
             {
                 ProcessedItem newItem = ProcessedItem.CreateCast(data.TypeToCast);
                 expressionTree.RemoveAt(i);
                 expressionTree.Insert(i, newItem);
                 return true;
             }
         }
         return false;
     }));
 }
 public static Expression <Func <T, TResult> > GetExpression <T, TResult>(this IExpressionPart filterPart, IDictionary <string, ParameterExpression> parameters, string parameterName)
 => (Expression <Func <T, TResult> >)filterPart.GetExpression
 (
     typeof(T),
     typeof(TResult),
     parameters,
     parameterName
 );