我需要一些小问题的绝望帮助,我相信对于那些在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;
}
提前致谢!
答案 0 :(得分:1)
DbSet
类没有ToList
方法或扩展方法,您应该创建通用方法来解决问题:
public void FillCombo<T>(... , List<T> datasource, ...) where T:class
{
combo.DataSource = datasource;
...
}
然后,当您将List<Category>
传递给方法时,将确定T的类型,Category
和List<Country>
相同。
以下是调用方法的一些示例:
FillCombo(..., context.Categories.ToList(), ...);
FillCombo(..., context.State.Where(st => st.CountryId.Trim() == id).ToList(), ...);