[英]Entity Framework DBSet as combobox/list datasource
对于一个小问题,我需要一些拼命的帮助,对于那些在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;
}
提前致谢!
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(), ...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.