【问题标题】:Entity Framework generic DbSet to List要列出的实体框架通用 DbSet
【发布时间】:2019-10-17 08:15:44
【问题描述】:

我正在尝试像这样将通用 DbSet 绑定到 Combobox

public static void BindComboboxByEntity(ComboBox combo, Type type, string displayMember, string valueMember, string orderBy)
{
    if (combo is ComboBox)
        using (var db = new MyDbContext())
        {
            combo.ValueMember = valueMember;
            combo.DisplayMember = displayMember;
            combo.DataSource = db.Set(type).OrderBy(orderBy);
        }
    }

调用:

BindComboboxByEntity(MyCombo, typeof(MyEntity), "name", "id", "name");

但我知道我需要将IQueryable 转换为List 才能将数据绑定到Combobox。我该怎么做?

【问题讨论】:

  • 添加了答案

标签: c# .net entity-framework linq


【解决方案1】:

请注意,IQueryable 仍然表示(通常)尚未执行的“查询”。您需要实际实现查询(例如使用 ToList())

combo.DataSource = db.Set(type).OrderBy(orderBy).ToList();

注意:你需要

using System.Linq;

【讨论】:

  • 如果就这么简单......我有一个错误 CS1061:link 虽然:linklink
  • Owww 刚刚注意到您的代码不是通用的。你能有像BindComboboxByEntity<T> 这样的东西而不是将Type type 作为参数传递吗?然后你可以写一些通用的东西,比如 dbSet,它可以正确地输入所有类型。
  • 顺便说一句,最好有一个中间层,这样您的组合框 UI 代码就不会直接包含数据库的代码。通常,使用 EF 是通过“存储库模式”完成的。它有助于解决这种麻烦。
【解决方案2】:

如果你通过Type type,试试这个

var result = db.Set(type).OrderBy(orderByString).ToListAsync();
combo.DataSource = result.Result;

但我的建议是传递一个通用类/实体

public static void BindComboboxByEntity<T>(ComboBox combo, string displayMember, string valueMember, string orderBy) where T : class
{
   if (combo is ComboBox)
        using (var db = new MyDbContext())
        {
            combo.ValueMember = valueMember;
            combo.DisplayMember = displayMember;
            combo.DataSource = db.Set<T>().OrderBy(orderBy);
        }

}

然后将其传递为

BindComboboxByEntity<MyEntity>(MyCombo, "name", "id", "name");

【讨论】:

  • 谢谢!这正是我所需要的!
  • @VladiSlav 不用担心,你用的是哪个部分?
  • 通过通用实体的第二部分。
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
相关资源
最近更新 更多