Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как передать имя таблицы в функцию как параметр?

#c_sharp #entity_framework #linq


Я использую Entity Framework. Есть некая функция, в которой происходит заполнение
dataGridView данными из таблицы.

private void data()
{
    using (Context context = new Context())
    {
        var items = from Items in context.Table1
                    select Items;

        dataGridView1.DataSource = items.ToList();
    }
}


Но я хочу сделать универсальную функцию, чтобы имя таблицы передавалось через параметр.
Подскажите, как нужно модифицировать функцию, чтобы это стало возможным?

Что-то типа этого:

void Test()
{
    data(tbl1);
    data(tbl2);
}

private void data(SomeType tableName)
{
    using (Context context = new Context())
    {
        var items = from Items in tableName
                    select Items;

        dataGridView1.DataSource = items.ToList();
    }
}

    


Ответы

Ответ 1



Если тип сущностей в таблицах одинаковый, то можно попробовать спустить функцию для выбора таблицы параметром: void Test() { data(c => c.tbl1); data(c => c.tbl2); } private void data(Func> tableSelector) { using (Context context = new Context()) { var items = from Items in tableSelector(context) select Items; dataGridView1.DataSource = items.ToList(); } } Если разный - добавьте генерик-параметр private void data(Func> tableSelector) { using (Context context = new Context()) { var items = from Items in tableSelector(context) select Items; dataGridView1.DataSource = items.ToList(); } } в живую не проверял, возможны опечатки Если нужно передавать имя таблицы именно как строку - придётся использовать reflection. Постарайтесь избегать этого :)

Ответ 2



Вы можете воспользоваться SqlQuery: var sql = string.Format("SELECT * FROM [{0}]", tablename); var query = db.Database.SqlQuery(sql); Как правило Entity == таблица, по этому можно сделать так: IQueryable query = context.Set(); Или так: PropertyInfo entityProperty = efcontext.GetType().GetProperties().Where(t => t.Name == e).Single(); var baseQuery = (IQueryable)entity.GetValue(efContext, null); var result = baseQuery.Where(t => ...); Или так: var tblNoteProperties = contextEntities .GetType() .GetProperties() .Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)) .Select(p => p.PropertyType.GetGenericArguments()[0]) .Where(t => t.Name == "tblName") .SelectMany(t => t.GetProperties()) .ToArray();

Комментариев нет:

Отправить комментарий