Пример #1
0
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            //Check if it is WithOptions method
            if (node.Method.DeclaringType == typeof(EntityQueryExtensions))
            {
                return(Visit(node.Arguments[0]));
            }
            //Check queryable method, replace with Enumerable equivalent
            var enumMethod = QueryableToEnumerableMapping.GetGenericEnumerableFor(node.Method);

            if (enumMethod != null)
            {
                //replace with Enumerable.cs method
                var args = new Expression[node.Arguments.Count];
                for (int i = 0; i < args.Length; i++)
                {
                    args[i] = ExpressionHelper.Unqoute(this.Visit(node.Arguments[i]));
                }
                var enumCallNode = Expression.Call(enumMethod, args);
                return(enumCallNode);
            }
            // Check if it is string.StartsWith method - change to case insensitive version
            if (node.Method == EntityCacheHelper.StringStartsWith1Method && _caseMode == StringCaseMode.CaseInsensitive)
            {
                //Change s.StartsWith(substr) to s.StartsWith(substr, String.Comparison.InvariantCultureIgnoreCase)
                var nodeObj = base.Visit(node.Object);
                var nodeArg = base.Visit(node.Arguments[0]);
                return(Expression.Call(nodeObj, EntityCacheHelper.StringStartsWith2Method, nodeArg, EntityCacheHelper.ConstInvariantCultureIgnoreCase));
            }
            //default
            return(base.VisitMethodCall(node));
        }
Пример #2
0
        public static MethodInfo GetGenericEnumerableFor(MethodInfo queryableMethod)
        {
            if (queryableMethod.DeclaringType != typeof(Queryable))
            {
                return(null);
            }
            var enumMethod = QueryableToEnumerableMapping.GetEnumerableFor(queryableMethod);

            if (enumMethod == null)
            {
                return(null);
            }
            if (enumMethod.IsGenericMethodDefinition)
            {
                var methodGenArgs = queryableMethod.GetGenericArguments();
                return(enumMethod.MakeGenericMethod(methodGenArgs));
            }
            else
            {
                return(enumMethod);
            }
        }