Esempio n. 1
0
//		private Expression VisitSelect (MethodCallExpression methodCall)
//		{
//			List<MemberExpression> mes = MemberExpressionFinder.Find (methodCall.Arguments[1], this.tableFinder);
//			if (!TryGetTable (mes))
//				return methodCall;
//
//			Type returnType = null;
//
//			List<Tuple<string, Type>> projs = new List<Tuple<string, Type>>();
//			foreach (MemberExpression me in mes)
//			{
//				Tuple<string, Type> column = this.tableFinder.GetColumn (me.Member);
//				if (column == null)
//					return methodCall;
//
//				if (returnType == null)
//					returnType = column.Item2;
//				if (returnType != column.Item2)
//					return methodCall;
//
//				projs.Add (column);
//			}
//
//			ReturnType = returnType;
//			this.fallback = true;
//
//			(this.projections ?? (this.projections = new List<Tuple<string, Type>>()))
//				.AddRange (projs);
//
//			return methodCall.Arguments[0];
//		}

        private Expression VisitSelectMany(MethodCallExpression methodCall)
        {
            List <MemberExpression> mes = MemberExpressionFinder.Find(methodCall, tableFinder);

            if (mes.Count > 1)
            {
                fallback = true;
                return(methodCall);
            }

            if (!TryGetTable(mes))
            {
                return(methodCall);
            }

            ContentResolverColumnMapping column = tableFinder.GetColumn(mes[0].Member);

            if (column == null || column.ReturnType.GetGenericTypeDefinition() != typeof(IEnumerable <>))
            {
                fallback = true;
                return(methodCall);
            }

            ReturnType = column.ReturnType.GetGenericArguments()[0];

            return(Expression.Constant(
                       Activator.CreateInstance(typeof(Query <>).MakeGenericType(ReturnType), provider)));
            //return methodCall.Arguments[0];
        }
		internal static List<MemberExpression> Find (Expression expression, ITableFinder tableFinder)
		{
			if (expression == null)
				throw new ArgumentNullException ("expression");
			if (tableFinder == null)
				throw new ArgumentNullException ("tableFinder");

			var finder = new MemberExpressionFinder (tableFinder);
			finder.Visit (expression);

			return finder.expressions;
		}
Esempio n. 3
0
        internal static List <MemberExpression> Find(Expression expression, ITableFinder tableFinder)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }
            if (tableFinder == null)
            {
                throw new ArgumentNullException("tableFinder");
            }

            var finder = new MemberExpressionFinder(tableFinder);

            finder.Visit(expression);

            return(finder.expressions);
        }