在商业智能(BI)应用中,数据的可视化呈现对于用户理解数据和做出决策至关重要。层次结构视图是其中一种常见的数据展示方式,它允许用户通过钻取(drilling)功能,从高层次的总体数据逐步深入到低层次的具体数据。本文将介绍如何使用SQL Server和Silverlight创建一个层次结构视图,具体来说,是如何通过一个规范化的维度层次结构(雪花模式)来创建视图,并将其填充到Silverlight的TreeView控件中。
首先,需要在SQL Server Management Studio中创建一个视图。这个视图将把两个表——Category和Product表——的数据转换成一个具有父子关系的表,其中CategoryID作为父ID,ProductID作为子ID。以下是创建视图的T-SQL代码示例:
-- 创建视图的T-SQL代码
CREATE VIEW dim_product_vw AS
SELECT
CategoryID,
ProductID,
ProductName
FROM
Product
WHERE
CategoryID IS NOT NULL
UNION ALL
SELECT
0 AS CategoryID,
CategoryID AS ProductID,
CategoryName AS ProductName
FROM
Category
为了在TreeView中利用层次数据模板,需要将数据放入一个表中,创建一个主索引,并在CategoryID和ProductID之间建立父子关系。
在Visual Studio 2010中创建一个新的RIA Services EnabledSilverlight项目。这个步骤相对直观,按照Visual Studio的向导操作即可。
选择NWAnalytics.Web项目,然后按下ALT+ENTER键创建项目的设置文件。在设置文件中,选择连接字符串作为设置值的类型,并设置连接字符串以连接到服务器实例和数据库。测试连接成功后,保存解决方案并构建项目以清除警告信息。
在NWAnalytics.Web项目中添加一个新的项。从已安装的模板中选择Visual C#\Data\ADO.NET Entity Data Model模板。在向导中选择“从数据库生成”,然后按照向导的提示操作。重命名模型的导航属性,使其更具描述性,并指示实体之间的关系。保存并构建项目。
在NWAnalytics.Web项目中添加一个新的项。从已安装的模板中选择Visual C#\Web\Domain Service Class模板。在添加新的域服务类时,按照向导的提示进行选择,然后点击确定。保存并构建项目。
从Visual Studio工具箱中拖动TreeView控件到MainPage.xaml,并将其命名为tvProduct。然后,需要为TreeView控件添加一个层次数据模板,并将其绑定到域服务的Products代理类。最终的XAML代码应该类似于以下片段:
<TreeView x:Name="tvProduct">
<TreeView.HierarchicalDataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ProductName}" />
</StackPanel>
</TreeView.HierarchicalDataTemplate>
</TreeView>
打开MainPage.xaml.cs,添加对NWAnalytics.Web项目的引用,并添加初始化代码以填充TreeView,如下所示:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
tvProduct.ItemsSource = nwAnalyticsDomainContext.GetProducts();
}
}