如何将带外键关联的两张表数据导入DataGrid?
问题描述
我有两张通过外键关联的数据库表,已创建对应实体类User_Tbl.cs和RegFee_Tbl.cs。现有一个名为membersdataGrid的DataGrid控件,其中3列需绑定RegFee_Tbl的数据,1列绑定User_Tbl的数据。目前在Dashboard用户控件的Load方法中只能加载单个表的数据,不知道如何将两张关联表的数据一起导入到DataGrid中。
现有代码
Dashboard.cs 加载方法
public partial class Dashboard : UserControl { GymDbEntities db = new GymDbEntities(); public static DataGrid datagrid; public Dashboard() { InitializeComponent(); Load(); } private void Load() { membersdataGrid.ItemsSource = db.User_Tbl.ToList(); //membersdataGrid.ItemsSource = db.RegFee_Tbl.ToList(); datagrid = membersdataGrid; } }
DataGrid的XAML代码
<DataGrid Language="fa-IR" x:Name="membersdataGrid" RowStyle="{DynamicResource DataGridRowStyle1}" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}" CellStyle="{DynamicResource DataGridCellStyle1}" Style="{DynamicResource DataGridStyle1}"> <DataGrid.Columns> <!--bara eyjad sotone checkbox--> <DataGridCheckBoxColumn CanUserResize="False" Width="auto" ElementStyle="{StaticResource CheckBoxStyle1}"> <DataGridCheckBoxColumn.HeaderTemplate> <DataTemplate> <CheckBox Style="{StaticResource CheckBoxStyle1}" /> </DataTemplate> </DataGridCheckBoxColumn.HeaderTemplate> </DataGridCheckBoxColumn> <DataGridTextColumn Header="#" IsReadOnly="True" CanUserReorder="False" Width="auto" Binding="{Binding ID}"/> <DataGridTemplateColumn Header="اعضا" IsReadOnly="True" Width="*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Border Width="25" Height="25" CornerRadius="50" Margin="0 0 10 0" Background="{Binding BgColor}"> <TextBlock Text="{Binding Character}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" Margin="0 0 0 1"/> </Border> <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="نام پدر" IsReadOnly="True" Width="*" Binding="{Binding Fee}"/> <DataGridTextColumn Header="شماره تماس" IsReadOnly="True" Width="*" Binding="{Binding NumberPhone}"/> <DataGridTextColumn Header="آخرین واریزی" IsReadOnly="True" Width="*" Binding="{Binding FatherName}" /> <DataGridTemplateColumn Header="عملیات" IsReadOnly="True" Width="auto"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Button x:Name="GridEditBtn" Style="{StaticResource gridEditbutton}"> <Icon:PackIconMaterial Kind="PencilBoxOutline" Style="{StaticResource gridButtonIcon}"/> </Button> <Button x:Name="GridRemoveBtn" Click="GridRemoveBtn_Click" Style="{StaticResource gridRemovebutton}" Margin="5 0 0 0" > <Icon:PackIconMaterial Kind="DeleteOutline" Style="{StaticResource gridButtonIcon}" /> </Button> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
解决方案
方法1:用Entity Framework Include加载关联数据
利用EF的Include方法预加载关联实体,直接通过导航属性访问关联表数据:
- 修改Load方法,预加载关联的
RegFee_Tbl数据(假设User_Tbl中有名为RegFee_Tbl的导航属性):
private void Load() { var data = db.User_Tbl.Include(u => u.RegFee_Tbl).ToList(); membersdataGrid.ItemsSource = data; datagrid = membersdataGrid; }
- 调整DataGrid中绑定
RegFee_Tbl属性的列,补充导航属性路径:
<!-- 比如Fee是RegFee_Tbl的属性,修改绑定路径 --> <DataGridTextColumn Header="نام پدر" IsReadOnly="True" Width="*" Binding="{Binding RegFee_Tbl.Fee}"/>
其他属于RegFee_Tbl的属性,都要按此格式修改绑定路径;属于User_Tbl的属性保持原绑定不变。
方法2:创建DTO类整合数据
如果不想直接使用实体类,可创建专门用于DataGrid展示的DTO类,整合两张表的所需属性:
- 定义DTO类:
public class MemberDto { public int ID { get; set; } public string BgColor { get; set; } public string Character { get; set; } public string Name { get; set; } // User_Tbl属性 public string NumberPhone { get; set; } public string FatherName { get; set; } // RegFee_Tbl属性 public decimal Fee { get; set; } }
- 在Load方法中查询并映射到DTO(替换实际的外键关联字段,比如
u.ID equals rf.UserId):
private void Load() { var data = from u in db.User_Tbl join rf in db.RegFee_Tbl on u.ID equals rf.UserId select new MemberDto { ID = u.ID, BgColor = u.BgColor, Character = u.Character, Name = u.Name, NumberPhone = u.NumberPhone, FatherName = u.FatherName, Fee = rf.Fee }; membersdataGrid.ItemsSource = data.ToList(); datagrid = membersdataGrid; }
这种方式下,原DataGrid的绑定无需修改。
注意事项
- 确保实体类的导航属性配置正确,否则
Include方法无法加载关联数据。 - 如果是一对多关系,需调整绑定逻辑(比如用DataTemplate展示多条关联数据),若只需最新一条关联数据,可在查询时先筛选。
内容的提问来源于stack exchange,提问作者Mehran
相关产品推荐
相关产品推荐

