Entity Framework Core, выполните raw SQL и параметризуйте имя таблицы - PullRequest
1 голос
/ 07 августа 2020

Я использую Entity Framework Core, и когда я запускаю следующий запрос, все работает так, как ожидалось, и выбирает все сущности из таблицы flasher_equipment.

public async Task<IEnumerable<BaseEquipmentType>> GetNewAvailableEquipment(string tableName)
{
    DbSet<BaseEquipmentType> dbSet = _context.Set<BaseEquipmentType>();
    IQueryable<BaseEquipmentType> types = dbSet.FromSql($"select * from flasher_equipment");
    return await types.ToArrayAsync();
}

но теперь, вместо жесткого кодирования таблицы name (flasher_equipment) Я хочу передать его как параметр.

Я пробовал изменить код следующим образом:

public async Task<IEnumerable<BaseEquipmentType>> GetNewAvailableEquipment(string tableName)
{
    DbSet<BaseEquipmentType> dbSet = _context.Set<BaseEquipmentType>();
    IQueryable<BaseEquipmentType> types = dbSet.FromSql($"select * from {tableName}");
    return await types.ToArrayAsync();
}

, а также

public async Task<IEnumerable<BaseEquipmentType>> GetNewAvailableEquipment(string tableName)
{
    DbSet<BaseEquipmentType> dbSet = _context.Set<BaseEquipmentType>();
    IQueryable<BaseEquipmentType> types = dbSet.FromSql("select * from {0}", tableName);
    return await types.ToArrayAsync();
}

Каждый раз, когда я получаю сообщение об ошибке:

Grp c .AspNetCore.Server.ServerCallHandler [6] Ошибка при выполнении служебного метода GetByPlanIdAnImplementation. Oracle .ManagedDataAccess.Client.OracleException (0x80004005): ORA-00903: недопустимое имя таблицы

Почему параметризация имени таблицы в качестве параметра вызывает ошибку sh?

1 Ответ

0 голосов
/ 07 августа 2020

Кажется, проблема метода FromSql с интерполяцией строки .

Вероятно, это сработает, если вы интерполируете строку вне метода, как:

public async Task<IEnumerable<BaseEquipmentType>> GetNewAvailableEquipment(string tableName)
{
    DbSet<BaseEquipmentType> dbSet = _context.Set<BaseEquipmentType>();
    string sqlStatement = $"select * from {tableName}"; 
    IQueryable<BaseEquipmentType> types = dbSet.FromSql(sqlStatement);
    return await types.ToArrayAsync();
}
...