如何使用 db table 中的值绑定 ComboBox 并避免重复

How to bind a ComboBox with values from db table and avoid duplicates

在我的 WPF 项目中,我试图将组合框绑定到数据库 table 列并避免重复。我正在使用 Entity Framework。 到目前为止,我已经能够成功地将 Combobox 绑定到列(因为 EF 完成了大部分工作),但我无法摆脱重复项。

我的名为 Departments 的数据库有 2 列。一个名为 DepartmentID,一个名为 DepartmentName。 DepartmentName 是我想要的,也是重复的(这不是设置错误)。 我还有一个名为 Employees 的 table,它具有对 DepartmentID 的外键引用。

我尝试了一些使用 LINQ 和创建列表的建议,但没有成功。我试过将 Filter 与 collectionViewSource 一起使用。我试过转换器。我尝试过以各种方式使用 Distinct,最近我尝试对 DepartmentNames 进行分组。 None 成功。

这是当前显示的 DepartmentNames,但有很多重复项。

资源:

<CollectionViewSource x:Key="employeeViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Employee}, CreateList=True}"/>

组合框:

    <ComboBox x:Name="departmentNameComboBox" DataContext="{StaticResource employeeViewSource}" 
ItemsSource="{Binding}" DisplayMemberPath="Department.DepartmentName" HorizontalAlignment="Left" Height="Auto" Margin="3" VerticalAlignment="Center" Width="120"/>

我真正想要的是那个该死的 ComboBox 只显示不同的部门名称。我以为这很容易,但是昨天花了一整天,我似乎不是。至少不适合我。 :-) 谁能帮忙?

我建议您只创建一个数据库对象,它只选择您实际需要的列并将您的组合框绑定到它。我发现这是最干净的解决方案,因为您只需更改源 table/view,组合框就会自动适应。

您可以执行原始查询:

var departments = context.Departments
                  .SqlQuery("SELECT Min(DepartmentId), DepartmentName FROM #tmp GROUP BY DepartmentName")
                  .ToList<Department>();

或使用 LINQ 对结果进行分组:

var departments = (from d in context.Department
        group d by d.DepartmentName into g
        select new Department
        {
            DepartmentId = g.Min(x => x.DepartmentId),
            DepartmentId = g.Key
        }.ToList();