public AxisCell GetOrAddCell4Tuple(Tuple Tuple)
		{
			AxisCell result = null;
			if (!AllCellsByTuple.TryGetValue(Tuple, out result))
			{
				if (Tuple.Member.ParentMember != null)
					result = GetOrAddCell4Tuple(new Tuple(Tuple.ParentTuple, Tuple.Member.ParentMember));
				else if (Tuple.ParentTuple != null)
					result = GetOrAddCell4Tuple(Tuple.ParentTuple);

				
				result = new AxisCell(result, Tuple);
				AllCellsByTuple[Tuple]=result;
				
				// FirstHierarchyMembers
			}
			return result;
		}
		public Tuple(Tuple ParentTuple, HierarchyMember Member)
		{
			this.ParentTuple = ParentTuple;
			if (ParentTuple!=null)
				this.hashCode=ParentTuple.GetHashCode();
				
			this.Member = Member;
			this.hashCode^=Member.GetHashCode();
		}
		internal AxisCell(AxisCell ParentAxisCell, Tuple Tuple)
		{
			this.Tuple = Tuple;
			this.ParentAxisCell = ParentAxisCell;
			if (ParentAxisCell!=null)
			{
				if (object.ReferenceEquals(ParentAxisCell.Tuple.Member.Hierarchy,Tuple.Member.Hierarchy))
					ParentAxisCell.ChildsInMyHierarchy.Add(this);
				else
					ParentAxisCell.ChildsInNextHierarchy.Add(this);
			}
		}
		public MdxTupleExpression(Tuple Tuple)
		:this(Tuple.GenerateMembers(new List<MdxExpression>()))
		{}