Entity Framework уже позволяет выполнять необработанные SQL-запросы и сопоставлять их результаты с объектами с SqlQuery. Вам не нужно использовать raw ADO.NET. Вы могли бы просто написать:
public IEnumerable<T> LoadSomeLoads<T>(string table,int loadId)
{
using (ReconContext context = new ReconContext())
{
var sq;="SELECT * FROM "+ table+ " WHERE LoadId = @p0";
var results= context.SqlQuery<T>(sql,loadId)
.ToArray();
}
}
Вы должны проверить параметр table
, чтобы гарантировать, что это разрешенное имя таблицы, в противном случае кто-то может запросить таблицы у него нет разрешения, или просто просмотреть данные, заставляя имя таблицы.
Вы избегаете катастрофических инъекций путем использования параметров, но это не предотвращает несанкционированное раскрытие информации, если кто-то может заставить запрос на неприемлемую таблицу.
Я подозреваю, что вы должны смотреть на наследование типа «на стол». Похоже, вы хотите загружать разные классы из разных таблиц, где обычно используется хотя бы одно свойство (LoadId).
С Table-per-Type EF сопоставляет различные типы иерархии наследования с различными таблицами и выбирает правильную таблицу на основе конфигурации сопоставления.
Предполагая, например, что у вас есть следующие классы:
public abstract class LoadTypeBase
{
public int LoadId { get; set; }
...
}
[Table("LoadTableA")]
public class LoadTypeA : LoadTypeBase
{
...
}
[Table("LoadTableB")]
public class LoadTypeA : LoadTypeBase
{
...
}
и этот контекст
public class ReconContext: DbContext
{
...
public DbSet<LoadTypeBase> Loads { get; set; }
}
Вы можете запросить для всех типов нагрузок с конкретным LoadId с:
var query = from someLoad in context.Loads
where someLoad.LoadId = loadId
select someLoad;
Вы можете изменить результаты до определенного типа с помощью OfType<T>()
var query = from someLoad in context.Loads.OfType<LoadTypeB>()
where someLoad.LoadId = loadId
select someLoad;
Непонятно, для чего «обогащение» или как оно относится к «DataTable». –
Также неясно, что это связано с 'Linq-To-Entities' или с типом' T'. Вы хотите, чтобы общий метод преобразовывал 'DataTable' в' IEnumerable ', где' T' - это настраиваемый класс? Тогда есть уже доступные подходы, используя отражение, подобное [this] (http://stackoverflow.com/questions/12662318/how-to-convert-datatable-to-listt-using-reflections). –
Это атака SQL Injection, ожидающая своего появления. Интересно, что произойдет, если я передам '2 OR 1 = 1 -' в качестве значения 'ExternalLoadId' –