避免大量if - else检查 - 使用实体框架从字符串中选择表

Joh*_*ews 6 c# entity-framework

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

例:

string = "Person";
var str = //something
List<str> list = (from u in dbContext.str select u).ToList();
Run Code Online (Sandbox Code Playgroud)

tia*_*tia 2

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

Dictionary<string,Type> typeMap = new Dictionary<string,Type> {
    { "Person", typeof(Person) },
    { "Student", typeof(Student) },
    { "Grade", typeof(Grade) },
}
Run Code Online (Sandbox Code Playgroud)

然后将其绑定为ComboBox

cbTables.DataSource = new BindingSource(typeMap, null);
cbTables.DisplayMember = "Key";
cbTables.ValueMember = "Value";
Run Code Online (Sandbox Code Playgroud)

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

Type entityType = (Type) cbTables.SelectedValue;
DbSet set = dbContext.Set(entityType);
Run Code Online (Sandbox Code Playgroud)

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

List<Student> studentList = set.Cast<Student>.ToList();
Run Code Online (Sandbox Code Playgroud)