避免大量的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();
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;
}
}