6

我正在使用实体框架开发一个应用程序。我有一个组合框,其中包含数据库中表的名称。我有以下代码:

string table = cbTables.SelectedItem.ToString();
using (var dbContext = new Entities()) {
    if (table.Equals("Person")) {
        List<Person> list = (from l in dbContext.People select l).ToList();
    } else if (table.Equals("Student")) {
        List<Student> list = (from u in dbContext.Student select u).ToList();
    } else if (table.Equals("Grade")) {
        List<Grade> list = (from p in dbContext.Grade select p).ToList();
}

我怎样才能避免所有这些 if-else 检查?是否可以从包含名称的字符串中获取类的名称?

例子:

string = "Person";
var str = //something
List<str> list = (from u in dbContext.str select u).ToList();
4

4 回答 4

2

ComboBox能够通过数据源显示字典,因此您可以将显示文本与您实际想要的数据绑定,而不是检查显示文本。然后在这种情况下,我们会将它绑定到实体的类型:

Dictionary<string,Type> typeMap = new Dictionary<string,Type> {
    { "Person", typeof(Person) },
    { "Student", typeof(Student) },
    { "Grade", typeof(Grade) },
}

然后将其绑定到ComboBox喜欢:

cbTables.DataSource = new BindingSource(typeMap, null);
cbTables.DisplayMember = "Key";
cbTables.ValueMember = "Value";

然后,当您需要获取选定的实体时,请使用

Type entityType = (Type) cbTables.SelectedValue;
DbSet set = dbContext.Set(entityType);

但是,在此之后,您需要entityType相应地检查和显示表单。如果您的表单需要列表,例如列表,则使用

List<Student> studentList = set.Cast<Student>.ToList();
于 2013-06-09T13:26:40.063 回答
1

假设您不想要开关但想要动态的东西,您可以使用查询来代替:

using (var context = new Context())
{
    var people = context.Database.SqlQuery<Object>(
                       "select * from People").ToList();
}
于 2013-06-09T11:59:03.947 回答
1

扩展我的评论:

您可以声明一个字典以从表名字符串映射到作为您的表的实际 DbSet:

string table = cbTables.SelectedItem.ToString();
using (var dbContext = new Entities()) {
    Dictionary<string, DbSet> mapping = new Dictionary<string, DbSet> {
        { "Person", dbContext.Person },
        { "Student", dbContext.Student },
        { "Grade", dbContext.Grade }
    };

    //...

问题仍然存在 - 如何处理您的结果集?现在您已经输入了每个表成员的特定类型的列表;如果没有某种决定(如果/切换),您将无法做到这一点。

于 2013-06-09T12:13:54.247 回答
0

你为什么不为此目的使用 Switch?

string table = cbTables.SelectedItem.ToString();

using (var dbContext = new Entities()) 
{
    switch (table)
    {
        case"Person":
            List<Person> list = (from l in dbContext.People select l).ToList();
            break;
        case"Student":
            List<Student> list = (from u in dbContext.Student select u).ToList();
            break;
        case"Grade":
            List<Grade> list = (from p in dbContext.Grade select p).ToList();
            break;
    }
}
于 2013-06-11T05:08:05.270 回答