实体框架DBSet作为组合框/列表数据源

时间:2016-03-01 09:22:40

标签: c# sql winforms entity-framework combobox

我需要一些小问题的绝望帮助,我相信对于那些在Entity Framework拥有多年经验的经验丰富的程序员来说,这很容易。这是我第一次使用EF。我有一组需要在Form_Load事件上填充的组合框。为了重构和避免代码冗余,我做了一个函数,所有组合调用传递必要的参数,让它像这样填充:

    private void FormEntities_Load(object sender, EventArgs e)
    {
        //string query = "Select Id, Name from Table_Name";
        FillCombo(cboCountry, "Select Id, Name from Country", "Name", "Id");
        FillCombo(cboCategory, "Select Id, Name from Category", "Name", "Id");

    }

    public void FillCombo(ComboBox combo, string query, string displayMember, string valueMember)
    {
        sqlCmd = new SqlCommand(query, sqlConStr);
        sqlDa = new SqlDataAdapter(sqlCmd);
        dt = new DataTable();
        sqlDa.Fill(dt);
        combo.DataSource = dt;
        combo.DisplayMember = displayMember;
        combo.ValueMember = valueMember;
        combo.Selected.Index = -1;
    }

由于我现在使用EF,我打算使用相同的功能填充组合框,但这一次,使用EF实体作为我的数据源,如下所示。问题是,我不知道我应该在函数中为访问DBSet集合的第二个参数定义哪个类/类型。我已经尝试了下面的代码,但它只是不起作用。当我调用该函数时,编译器会抛出一个错误,说我已经传递了一些无效的参数。我在这里做错了什么?

    private void FormEntities_Load(object sender, EventArgs e)
    {
    SystemDBContext ctxt = new SystemDBContext ();

        FillCombo(cboCountry, ctxt.CountryEntity, "Name", "Id");
        FillCombo(cboCategory, ctxt.CategoryEntity, "Name", "Id");
    }

    public void FillCombo(MetroFramework.Controls.MetroComboBox combo, DbSet datasource, string displayMember, string valueMember)
    {
        combo.DataSource = datasource.ToList();
        combo.DisplayMember = displayMember;
        combo.ValueMember = valueMember;
        combo.SelectedIndex = -1;
    }

提前致谢!

1 个答案:

答案 0 :(得分:1)

DbSet类没有ToList方法或扩展方法,您应该创建通用方法来解决问题:

public void FillCombo<T>(... , List<T> datasource, ...) where T:class
{
    combo.DataSource = datasource;
    ...
}

然后,当您将List<Category>传递给方法时,将确定T的类型,CategoryList<Country>相同。

以下是调用方法的一些示例:

FillCombo(..., context.Categories.ToList(), ...);
FillCombo(..., context.State.Where(st => st.CountryId.Trim() == id).ToList(), ...);