Language: C#
MdxMemberReader
1: using System; 2: using System.Collections.Generic; 3: using System.Data; 4: using System.Linq; 5: using System.Xml; 6: using System.Xml.Linq; 7: using LinqToTree; 8: 9: namespace AdomdClient.Data 10: { 11: public class MdxMemberReader 12: { 13: private const string MeasuresPrefix = "[Measures].["; 14: private const string CaptionSuffix = "].[MEMBER_CAPTION]"; 15: 16: public IEnumerable<MdxMemberInfo> Members { get; private set; } 17: 18: public IEnumerable<ILinqToTree<MdxMemberInfo>> Tree 19: { 20: get { return Members.OfType<ILinqToTree<MdxMemberInfo>>(); } 21: } 22: 23: public MdxMemberReader(XmlReader reader, int index) 24: { 25: var root = XElement.Load(reader); 26: Initialize(root, index); 27: } 28: 29: private void Initialize(XElement root, int index) 30: { 31: var members = new List<MdxMemberInfo>(); 32: this.Members = members; 33: 34: var ns = XNamespace.Get("urn:schemas-microsoft-com:xml-analysis:mddataset"); 35: var axis = root.Element(ns + "Axes") 36: .Elements(ns + "Axis").FirstOrDefault(a => ((String)a.Attribute("name")) == ("Axis" + index)); 37: 38: if (axis != null) 39: { 40: var tuples = axis.Element(ns + "Tuples").Elements(ns + "Tuple"); 41: MdxMemberInfo current = null; 42: 43: foreach (var tuple in tuples) 44: { 45: var el = tuple.Element(ns + "Member"); 46: var info = new MdxMemberInfo() 47: { 48: UniqueName = el.Element(ns + "UName").Value, 49: Caption = el.Element(ns + "Caption").Value, 50: Level = Int32.Parse(el.Element(ns + "LNum").Value) 51: }; 52: 53: if (current == null) 54: { 55: current = info; 56: members.Add(info); 57: } 58: else 59: { 60: // if (info.Level == current.Level) 61: var parent = current.Parent; 62: 63: if (info.Level == current.Level + 1) 64: { 65: parent = current; 66: } 67: else if (info.Level < current.Level) 68: { 69: parent = current.Parent; 70: 71: while (parent != null && parent.Level >= info.Level) 72: { 73: parent = parent.Parent; 74: } 75: } 76: 77: if (parent != null) 78: { 79: parent.Children.Add(info); 80: info.Parent = parent; 81: } 82: else 83: { 84: members.Add(info); 85: } 86: 87: current = info; 88: } 89: } 90: } 91: } 92: 93: #region FormatColumnName Methods 94: 95: public static void FormatColumnNames(DataSet dataSet) 96: { 97: foreach (DataTable table in dataSet.Tables) 98: { 99: FormatColumnNames(table); 100: } 101: } 102: 103: public static void FormatColumnNames(DataTable table) 104: { 105: foreach (DataColumn col in table.Columns) 106: { 107: FormatColumnName(col); 108: } 109: } 110: 111: public static void FormatColumnName(DataColumn col) 112: { 113: var name = col.ColumnName; 114: 115: if (name.StartsWith(MeasuresPrefix, StringComparison.OrdinalIgnoreCase)) 116: { 117: name = name.Substring(MeasuresPrefix.Length, name.Length - (MeasuresPrefix.Length + 1)); 118: } 119: else if (name.EndsWith(CaptionSuffix, StringComparison.OrdinalIgnoreCase)) 120: { 121: name = name.Substring(0, name.IndexOf(CaptionSuffix, StringComparison.OrdinalIgnoreCase)); 122: name = name.Substring(name.LastIndexOf('[') + 1); 123: } 124: 125: col.Caption = name; 126: col.ColumnName = name.Replace(" ", ""); 127: } 128: 129: #endregion FormatColumnName Methods 130: } 131: 132: public class MdxMemberInfo : ILinqToTree<MdxMemberInfo> 133: { 134: public string UniqueName { get; set; } 135: public string Caption { get; set; } 136: public int Level { get; set; } 137: 138: public MdxMemberInfo Parent { get; set; } 139: 140: private List<MdxMemberInfo> children; 141: public List<MdxMemberInfo> Children 142: { 143: get 144: { 145: if (children == null) 146: { 147: children = new List<MdxMemberInfo>(); 148: } 149: 150: return children; 151: } 152: set 153: { 154: children = value; 155: } 156: } 157: 158: public override string ToString() 159: { 160: return String.Format("{0} : {1}", UniqueName, Caption); 161: } 162: 163: #region ILinqToTree<MdxMemberInfo> Members 164: 165: IEnumerable<ILinqToTree<MdxMemberInfo>> ILinqToTree<MdxMemberInfo>.Children() 166: { 167: return this.Children.OfType<ILinqToTree<MdxMemberInfo>>(); 168: } 169: 170: ILinqToTree<MdxMemberInfo> ILinqToTree<MdxMemberInfo>.Parent 171: { 172: get { return this.Parent; } 173: } 174: 175: public MdxMemberInfo Item 176: { 177: get { return this; } 178: } 179: 180: #endregion 181: } 182: }
Tags:
Report Abuse
Subscribe
Discuss
What's new
What is it
New Snippet
Recent Snippets
My Snippets
Web Code
Search

