Вот код, разработанный сегодня для образца базы данных Northwind от Microsoft, который демонстрирует, как получить список таблиц из модели данных объекта, а затем отобразить верхние x строк из таблицы, выбранной в DataGridView.
Чтобы запустить приведенный ниже код следующим образом:
- Создайте приложение для форм Windows
- Добавьте модель данных сущности для БД Northwind, назовите ее 'NorthwindModel'
- Добавьте два поля со списком и представление таблицы данных (tablesComboBox, topXComboBox и dataGridViewForOutput)
- Добавьте элементы в topXComboBox (все, топ-5, топ-10 и т. Д. (Должно быть кратно 5, чтобы код работал)
- Измените имя формы на mainForm
- Выделите весь код в файле формы и замените его на следующее
using System;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace EntityFrameworkBrowser
{
public partial class mainForm : Form
{
public mainForm()
{
InitializeComponent();
}
private void mainForm_Load(object sender, EventArgs e)
{
Type type = typeof(NorthwindModelEntities);
var query = type.GetProperties().Where(p => p.GetMethod.ToString().ToLower().Contains(".dbset")).Select(m => m.Name);
tablesComboBox.DataSource = query.ToList();
topXComboBox.SelectedIndex = 1;
}
private async void BindTableData()
{
// Ensure the form has been initialised
if (topXComboBox.SelectedIndex.Equals(-1))
{
return;
}
// Get the DB context
NorthwindModelEntities dbContext = new NorthwindModelEntities();
// Get a reference to the type of the model
Type type = typeof(NorthwindModelEntities);
// Get the table name selected by the user in the combo box
string tableName = tablesComboBox.SelectedItem.ToString();
// Get a reference to the DbSet from the model
var prop = type.GetProperty(tableName);
// Get a reference to the getter for the DbSet
MethodInfo get = prop.GetMethod;
// Invoke the getter for the DbSet
object tableContent = get.Invoke(dbContext, null);
// Create a query that will return all records from the selected table
IQueryable query = (IQueryable)tableContent;
// Find out how many records the user has requested, All, Top5, Top 10, etc
int count = topXComboBox.SelectedIndex * 5;
// If a value other than all (selected index 0) has been selected the query needs to be refactored
if (count != 0)
{
// Get the element type for the DbSet from the entity data model
Type returnType = query.ElementType;
// Get a reference to the 'Take' extension method
MethodInfo takeMethod = (MethodInfo)typeof(Queryable).GetMethod("Take");
// Make a generic version of the 'Take' method
MethodInfo m = takeMethod.MakeGenericMethod(returnType);
// Refactor the query to take the top X records based on the user combo box selection
query = (IQueryable)m.Invoke(null, new object[] { query, count });
}
// Execute the query and bind the results to the data grid view
dataGridViewForOutput.DataSource = await query.ToListAsync();
}
private void tablesComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
BindTableData();
}
private void topXComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
BindTableData();
}
}
}
Надеемся, что комментарии должны объяснить, что происходит, вы не могли быне угадаю.
Надеюсь, это кому-нибудь поможет, так как потребовалось немного потренироваться
: 0)