C:\Program Files\Microsoft.NET\ADOMD.NET\100
using System.Collections.Generic;
using System.ServiceModel;
namespace SilverlightApplication1.Web
[ServiceContract]
public interface ICubeConnector
{
[OperationContract]
IEnumerable<Dictionary<string, object>> GetData(string query);
}
using System;
using System.Data;
using System.Linq;
using Microsoft.AnalysisServices.AdomdClient;
public class CubeConnector : ICubeConnector
public IEnumerable<Dictionary<string, object>> GetData(string query)
var table = GetDataTable(query);
var columns = table.Columns.Cast<DataColumn>();
return table.AsEnumerable().Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c.ColumnName] })
.ToDictionary(i => i.Column, i => i.Value != DBNull.Value ? i.Value : null));
private DataTable GetDataTable(string query)
AdomdConnection conn = new AdomdConnection("Data Source=localhost; Catalog=MyCube");
try
adapter.Fill(table);
finally
conn.Close();
return table;
<UserControl.Resources>
<Style x:Name="CustomDataPoint" TargetType="toolkit:ColumnDataPoint">
<Setter Property="DependentValueStringFormat" Value="{}{0:C}"/>
</Style>
<Style x:Name="CustomAxisLabel" TargetType="toolkit:AxisLabel">
<Setter Property="StringFormat" Value="{}{0:C}"/>
</UserControl.Resources>
<toolkit:Chart Name="MyChart" Title="Amount by Account Types" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="479" Width="714" >
<toolkit:ColumnSeries Title="Amount" DependentValueBinding="{Binding SeriesValue}" IndependentValueBinding="{Binding SeriesName}" AnimationSequence="FirstToLast" IsSelectionEnabled="True" DataPointStyle="{StaticResource CustomDataPoint}" RenderTransformOrigin="0.481,0.467"/>
<toolkit:Chart.Axes>
<toolkit:LinearAxis ShowGridLines="True" Orientation="Y" AxisLabelStyle="{StaticResource CustomAxisLabel}"></toolkit:LinearAxis>
</toolkit:Chart.Axes>
</toolkit:Chart>
using System.Windows.Controls;
using System.Windows.Controls.DataVisualization.Charting;
namespace SilverlightApplication1
public partial class MainPage : UserControl
public MainPage()
InitializeComponent();
svcCubeConnector.CubeConnectorClient client = new svcCubeConnector.CubeConnectorClient();
client.GetDataCompleted += client_GetDataCompleted;
client.GetDataAsync("SELECT NON EMPTY { [Measures].[AMOUNT] } ON COLUMNS, NON EMPTY { ([Account Type].[ACCOUNT DESC].[ACCOUNT DESC].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION ON ROWS FROM [MyCube]");
void client_GetDataCompleted(object sender, svcCubeConnector.GetDataCompletedEventArgs e)
IEnumerable<Dictionary<string, Object>> result = e.Result;
List<ChartClass> chartCollection = new List<ChartClass>();
object seriesName;
object seriesValue;
foreach (Dictionary<String, Object> _item in result)
// I am querying Dictionary with the Key
_item.TryGetValue("[Account Type].[ACCOUNT DESC].[ACCOUNT DESC].[MEMBER_CAPTION]", out seriesName);
_item.TryGetValue("[Measures].[AMOUNT]", out seriesValue);
chartCollection.Add(new ChartClass { SeriesName = seriesName.ToString(), SeriesValue = Convert.ToDouble(seriesValue) });
((ColumnSeries)MyChart.Series[0]).ItemsSource = chartCollection;
public string SeriesName { get; set; }
public double SeriesValue { get; set; }
Naomi N edited Revision 3. Comment: Minor edit
Featured on MSDN blogs here: blogs.msdn.com/.../visual-c-guru-connecting-to-ssas-cube-using-silverlight.aspx
This was featured on the home page of TNWiki!
Congratulations on winning the gold medal! blogs.technet.com/.../technet-guru-awards-july-2013.aspx
Another great article!