【问题标题】:Entity Framework DBSet as combobox/list datasource实体框架 DBSet 作为组合框/列表数据源
【发布时间】:2016-06-13 15:14:19
【问题描述】:

我在一个小问题上需要一些绝望的帮助,我相信对于那些在实体框架方面有多年经验的经验丰富的程序员来说这很容易。这是我第一次接触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;
    }

提前致谢!

【问题讨论】:

  • 您面临的确切异常是什么?
  • 错误是编译时错误:'System.Data.Entity.DbSet' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Data.Entity.DbSet' could be found (are you missing a using directive or an assembly reference?)
  • 没错,就是错误!谢谢。

标签: c# sql winforms entity-framework combobox


【解决方案1】:

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

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

然后,当您将 List&lt;Category&gt; 传递给方法时,将确定 T 的类型,并且将是 CategoryList&lt;Country&gt; 相同。

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

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

【讨论】:

  • 嗨,Reza 先生,你让我很开心。非常感谢,它工作正常。但是,我在第一篇文章中忘记解决一个问题。如果我有一个带有条件填充的组合框怎么办,即当类别组合被填充时它应该被填充。所以我需要发送带有“where”子句的第二个参数来过滤结果?
  • 没问题,答案基本相同;您可以将数据源参数的类型设置为List&lt;T&gt;,并始终将Where(....).ToList() 的结果传递给FillCombo 方法。如果您需要更详细的答案,请告诉我:)
  • 您好!再次感谢您为让我的生活更轻松所做的努力。很抱歉回复晚了,但技术上的困难阻止了我早点做。回到手头的问题,我想让您知道,只有调用该方法的第一个示例有效。在第二种方式中,我尝试填充编译器抱怨的条件组合,说:方法 FillCombo(Combo, DbSet, string, string)' 的类型参数无法从用法中推断出来。尝试明确指定类型参数。我在这里想念什么?抱歉,如果我没有掌握明显的内容!
  • 如果您阅读编辑后的答案,您会看到我将参数更改为 List&lt;T&gt;,因此您应该在 dbset 或查询的方法之外调用 ToList(),然后将其传递给方法.例如,当您想传递 Context.Categories 时,首先将其列入列表:Context.Categories.ToList() 然后传递它。或者当你要传递查询时,先查询.ToList(),然后传递给方法。
  • 好的,我知道了。惊人的。这是我使用 EF 的第一步,并且知道它已经存在多年,让我后悔没有早点开始使用它。它确实加快了您的代码编写速度。我肯定需要你的帮助来解决更多关于 EF 的问题。但我不知道我是否应该发布一个新问题,或者我是否可以继续在这里!!?
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多