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

本文关键字:框架 实体 字符串 选择 检查 if else | 更新日期: 2023-09-27 18:17:40

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

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();

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

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,例如List,那么使用

List<Student> studentList = set.Cast<Student>.ToList();

假设你不想要一个开关,但你想要一些动态的东西,你可以使用查询:

using (var context = new Context())
{
    var people = context.Database.SqlQuery<Object>(
                       "select * from People").ToList();
}

对我的评论进行扩展:

你可以声明一个字典,从你的表名字符串映射到实际的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 }
    };
    //...

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

为什么不使用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;
    }
}