I've got a database that contains 3 tables: Animals, Birds and Fishes.
For using them in my code I write myDb
variable as DbContext
with DbSet<TEntity>
objects.
So, I want to clean up code from this:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (comboBox1.Text)
{
case "Animals":
myDb.Animals.Load();
dataGridView1.DataSource = myDb.Animals.Local.ToBindingList();
break;
case "Birds":
myDb.Birds.Load();
dataGridView1.DataSource = myDb.Birds.Local.ToBindingList();
break;
case "Fishes":
myDb.Fishes.Load();
dataGridView1.DataSource = myDb.Fishes.Local.ToBindingList();
break;
}
}
To this:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
[some type] table;
switch (comboBox1.Text)
{
case "Animals":
table = myDb.Animals;
break;
case "Birds":
table myDb.Birds;
break;
case "Fishes":
table = myDb.Fishes;
break;
}
table.Load();
dataGridView1.DataSource = table.Local.ToBindingList();
}
Is there way to make it?
I've tried var table as object, but I can't call DbSet
methods.
You could create a small method with generics to load typed data into the grid:
void LoadInGrid<TEntity>(DbContext context, DataGridView dgv) where TEntity : class
{
var dbSet = context.Set<TEntity>();
dbSet.Load();
dgv.DataSource = dbSet.Local.ToBindingList();
}
Usage:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (comboBox1.Text)
{
case "Animals":
LoadInGrid<Animal>(myDb, dataGridView1);
break;
case "Birds":
LoadInGrid<Bird>(myDb, dataGridView1);
break;
case "Fishes":
LoadInGrid<Fish>(myDb, dataGridView1);
break;
}
}
I assume this is for small lookup tables. If you need to add predicates to the queries this simple method obviously won't suffice. But it wouldn't be too hard to add an Expression<Func<TEntity, bool>>
argument.