假设有你的员工/团体和协会之间的关系完整性,您可以把表中的一个DataSet
,加DataRelation
s到定义表之间的关系,然后创建DataColumn
S IN的关联表使用DataColumn.Expression
来从相关表中查找值。这会给你一个EmployeeGroups
表,可以显示每个员工和组的名称。
不幸的是,如果你想以另一种方式,即在Employees表中创建一个将所有组合在一起的列(这就是你所描述的),你不能用表达式来实现。在这种情况下,可能最容易做到你描述的内容,并将一列添加到Employees表中。但LINQ使填充该列非常简单,并且如果您已经创建表之间的关系,并且EmployeeGroups表中的列可以获得员工和组名,那么更好。
这给我们带来了什么。这是一个用Employees,Groups和EmployeeGroups表创建和填充数据集的类。它创建关联表和其他两个表之间的关系,其中DataColumn.Expression
和DataRow.GetChildRows
需要为了做他们的魔术。这也暴露了表为WPF可以绑定到IList
类型:
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
namespace JoinAndGroupDemo
{
public class DataSource
{
private DataSet _DS;
public DataSource()
{
CreateDataSet();
}
private void CreateDataSet()
{
_DS = new DataSet();
DataTable emp = _DS.Tables.Add("Employees");
DataTable grp = _DS.Tables.Add("Groups");
InitTable(emp);
InitTable(grp);
DataTable assoc = _DS.Tables.Add("EmployeeGroups");
assoc.Columns.Add("empId", typeof (int));
assoc.Columns.Add("grpId", typeof (int));
_DS.Relations.Add(new DataRelation("FK_EmployeeGroups_Employees",
emp.Columns["id"], assoc.Columns["empId"]));
_DS.Relations.Add(new DataRelation("FK_EmployeeGroups_Groups",
grp.Columns["id"], assoc.Columns["grpId"]));
assoc.Columns.Add("emp_name");
assoc.Columns["emp_name"].Expression = "Parent(FK_EmployeeGroups_Employees).name";
assoc.Columns.Add("grp_name");
assoc.Columns["grp_name"].Expression = "Parent(FK_EmployeeGroups_Groups).name";
emp.Rows.Add(new object[] { 1, "Malcolm Reynolds"});
emp.Rows.Add(new object[] { 2, "Zoe Washburne" });
emp.Rows.Add(new object[] { 3, "Hoban Washburne" });
emp.Rows.Add(new object[] { 4, "Irina Serra" });
emp.Rows.Add(new object[] { 5, "Jayne Cobb" });
emp.Rows.Add(new object[] { 6, "Kaylee Frye" });
emp.Rows.Add(new object[] { 7, "Simon Tam" });
emp.Rows.Add(new object[] { 8, "River Tam" });
emp.Rows.Add(new object[] { 9, "Derrial Book" });
grp.Rows.Add(new object[] { 1, "Command"});
grp.Rows.Add(new object[] { 2, "Combat" });
grp.Rows.Add(new object[] { 3, "Operations" });
grp.Rows.Add(new object[] { 4, "Other" });
assoc.Rows.Add(new object[] { 1, 1 });
assoc.Rows.Add(new object[] { 2, 1 });
assoc.Rows.Add(new object[] { 1, 2 });
assoc.Rows.Add(new object[] { 2, 2 });
assoc.Rows.Add(new object[] { 5, 2 });
assoc.Rows.Add(new object[] { 8, 2 }); // spoiler alert!
assoc.Rows.Add(new object[] { 3, 3 });
assoc.Rows.Add(new object[] { 6, 3 });
assoc.Rows.Add(new object[] { 4, 4 });
assoc.Rows.Add(new object[] { 7, 4 });
assoc.Rows.Add(new object[] { 8, 4 });
assoc.Rows.Add(new object[] { 9, 4 });
emp.Columns.Add("groups", typeof (string));
foreach (DataRow empRow in emp.Rows)
{
empRow["groups"] = string.Join(
", ",
empRow
.GetChildRows("FK_EmployeeGroups_Employees")
.AsEnumerable()
.Select(x => (string) x["grp_name"])
.ToArray());
}
grp.Columns.Add("employees", typeof(string));
foreach (DataRow grpRow in grp.Rows)
{
grpRow["employees"] = string.Join(
", ",
grpRow
.GetChildRows("FK_EmployeeGroups_Groups")
.AsEnumerable()
.Select(x => (string)x["emp_name"])
.ToArray());
}
}
private void InitTable(DataTable t)
{
t.Columns.Add("id", typeof (int));
t.Columns.Add("name", typeof (string));
// this is required by DataRelations
t.PrimaryKey = new DataColumn[] { t.Columns["id"]};
}
public IList Employees
{
get
{ return ((IListSource)_DS.Tables["Employees"]).GetList(); }
}
public IList Groups
{
get { return ((IListSource)_DS.Tables["Groups"]).GetList(); }
}
public IList EmployeeGroups
{
get { return ((IListSource)_DS.Tables["EmployeeGroups"]).GetList(); }
}
}
}
而这里的XAML用于显示所有这些信息的窗口:
<Window x:Class="JoinAndGroupDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:JoinAndGroupDemo"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:DataSource x:Key="DataSource"/>
<Style TargetType="Label">
<Style.Setters>
<Setter Property="Background" Value="Navy"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style.Setters>
</Style>
</Window.Resources>
<DockPanel DataContext="{StaticResource DataSource}">
<DockPanel DockPanel.Dock="Left">
<Label DockPanel.Dock="Top">Employees</Label>
<ListView ItemsSource="{Binding Employees}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=id}"/>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=name}"/>
<GridViewColumn Header="Groups" DisplayMemberBinding="{Binding Path=groups}"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
<DockPanel DockPanel.Dock="Left">
<Label DockPanel.Dock="Top">Groups</Label>
<ListView ItemsSource="{Binding Groups}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=id}"/>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=name}"/>
<GridViewColumn Header="Employees" DisplayMemberBinding="{Binding Path=employees}"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Top">Employee groups</Label>
<ListView ItemsSource="{Binding EmployeeGroups}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Employee" DisplayMemberBinding="{Binding Path=emp_name}"/>
<GridViewColumn Header="Group" DisplayMemberBinding="{Binding Path=grp_name}"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</DockPanel>
</Window>
你有问题吗? – 2010-05-14 23:59:17
当我正在格式化问题的过程中,我意外地错过了添加问题部分。对于那个很抱歉 – Wesley 2010-05-15 00:02:28