コード例 #1
0
        public Expression Optimize(Expression e, string?discriminator)
        {
            if (discriminator is not null)
            {
                if (e.Type.IsGenericType)
                {
                    Type?      sourceType  = e.Type.GetGenericArguments()[0];
                    MethodInfo wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(sourceType);
                    e = (Expression)wrapInWhere.Invoke(null, new object[] { e, discriminator });
                }
                else
                {
                    Type       sourceType  = e.Type;
                    MethodInfo wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(sourceType);

                    var        rootMethodCallExpression = e as MethodCallExpression;
                    Expression source            = rootMethodCallExpression !.Arguments[0];
                    var        discriminatorWrap = (MethodCallExpression)wrapInWhere.Invoke(null, new object[] { source, discriminator });

                    if (rootMethodCallExpression.Arguments.Count == 1)
                    {
                        e = Expression.Call(rootMethodCallExpression.Method, discriminatorWrap);
                    }
                    else
                    {
                        e = Expression.Call(rootMethodCallExpression.Method, discriminatorWrap, rootMethodCallExpression.Arguments[1]);
                    }
                }
            }

            e = LocalExpressions.PartialEval(e);
            return(Visit(e));
        }
コード例 #2
0
        public Expression Optimize(Expression e, string?discriminator)
        {
            if (discriminator is not null)
            {
                Type?      sourceType  = e.Type.GetGenericArguments()[0];
                MethodInfo?wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(new[] { sourceType });
                e = (Expression)wrapInWhere.Invoke(null, new object[] { e, discriminator });
            }

            e = LocalExpressions.PartialEval(e);
            return(Visit(e));
        }
コード例 #3
0
 public Expression Optimize(Expression e)
 {
     e = LocalExpressions.PartialEval(e);
     return(Visit(e));
 }