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)); }
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); } }