Example #1
0
            protected override Expression VisitMember(MemberExpression memberExpression)
            {
                TableFindResult result = tableFinder.Find(memberExpression);

                if (table == null)
                {
                    table = result;
                }
                else if (Table != result.Table || result.MimeType != table.MimeType)
                {
                    Fallback = true;
                    return(memberExpression);
                }

                ContentResolverColumnMapping cmap = tableFinder.GetColumn(memberExpression.Member);

                if (cmap == null || cmap.Columns == null)
                {
                    Fallback = true;
                    return(memberExpression);
                }

                currentMap = cmap;

                if (cmap.Columns.Length == 1)
                {
                    builder.Append(cmap.Columns[0]);
                }
                else
                {
                    throw new NotSupportedException();
                }

                return(base.VisitMember(memberExpression));
            }
Example #2
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];
        }
Example #3
0
        private Expression VisitSelect(MethodCallExpression methodCall)
        {
            MemberExpression me = FindMemberExpression(methodCall.Arguments[1]);

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

            ContentResolverColumnMapping column = tableFinder.GetColumn(me.Member);

            if (column == null || column.Columns == null)
            {
                return(methodCall);
            }

            (projections ?? (projections = new List <ContentResolverColumnMapping>())).Add(column);
            if (column.ReturnType.IsValueType || column.ReturnType == typeof(String))
            {
                ReturnType = column.ReturnType;
            }

            fallback = true;

            Type argType = GetExpressionArgumentType(methodCall.Arguments[0]);

            if (ReturnType == null || (argType != null && ReturnType.IsAssignableFrom(argType)))
            {
                return(methodCall.Arguments[0]);
            }

            return(Expression.Constant(
                       Activator.CreateInstance(typeof(Query <>).MakeGenericType(ReturnType), provider)));
        }
            protected override Expression VisitMemberAccess(MemberExpression memberExpression)
            {
                TableFindResult result = this.tableFinder.Find(memberExpression);

                if (this.table == null)
                {
                    this.table = result.Table;
                    this.builder.Append(result.QueryString);
                    this.arguments.AddRange(result.Arguments);
                }
                else if (this.table != result.Table)
                {
                    Fallback = true;
                    return(memberExpression);
                }

                ContentResolverColumnMapping cmap = this.tableFinder.GetColumn(memberExpression.Member);

                if (cmap == null || cmap.Columns == null)
                {
                    Fallback = true;
                    return(memberExpression);
                }

                this.currentMap = cmap;

                if (this.builder.Length > 0)
                {
                    this.builder.Append(" AND ");
                }

                if (cmap.Columns.Length == 1)
                {
                    this.builder.Append(cmap.Columns[0]);
                }
                else
                {
                    throw new NotSupportedException();
                }

                return(base.VisitMemberAccess(memberExpression));
            }
Example #5
0
        private Expression VisitOrder(MethodCallExpression methodCall)
        {
            MemberExpression me = FindMemberExpression(methodCall.Arguments[1]);

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

            ContentResolverColumnMapping column = tableFinder.GetColumn(me.Member);

            if (column != null && column.Columns != null)
            {
                StringBuilder builder = sortBuilder ?? (sortBuilder = new StringBuilder());
                if (builder.Length > 0)
                {
                    builder.Append(", ");
                }

                if (column.Columns.Length > 1)
                {
                    throw new NotSupportedException();
                }

                builder.Append(column.Columns[0]);

                if (methodCall.Method.Name == "OrderByDescending")
                {
                    builder.Append(" DESC");
                }

                return(methodCall.Arguments[0]);
            }

            return(methodCall);
        }
         protected override Expression VisitMember( MemberExpression memberExpression )
         {
            TableFindResult result = tableFinder.Find( memberExpression );
            if(table == null)
            {
               table = result;
            }
            else if(Table != result.Table || result.MimeType != table.MimeType)
            {
               Fallback = true;
               return memberExpression;
            }

            ContentResolverColumnMapping cmap = tableFinder.GetColumn( memberExpression.Member );
            if(cmap == null || cmap.Columns == null)
            {
               Fallback = true;
               return memberExpression;
            }

            currentMap = cmap;

            if(cmap.Columns.Length == 1)
            {
               builder.Append( cmap.Columns[0] );
            }
            else
            {
               throw new NotSupportedException();
            }

            return base.VisitMember( memberExpression );
         }
			protected override Expression VisitMemberAccess (MemberExpression memberExpression)
			{
				TableFindResult result = this.tableFinder.Find (memberExpression);
				if (this.table == null)
				{
					this.table = result.Table;
					this.builder.Append (result.QueryString);
					this.arguments.AddRange (result.Arguments);
				}
				else if (this.table != result.Table)
				{
					Fallback = true;
					return memberExpression;
				}

				ContentResolverColumnMapping cmap = this.tableFinder.GetColumn (memberExpression.Member);
				if (cmap == null || cmap.Columns == null)
				{
					Fallback = true;
					return memberExpression;
				}

				this.currentMap = cmap;

				if (this.builder.Length > 0)
					this.builder.Append (" AND ");

				if (cmap.Columns.Length == 1)
					this.builder.Append (cmap.Columns[0]);
				else
					throw new NotSupportedException();

				return base.VisitMemberAccess (memberExpression);
			}