2016-09-29 1 views
0

Я пытаюсь сделать вернуть DataTable значение из IEnumerable Тип Любой человек может помочь мне, если я буду проходить любого типа для IEnumerable он будет возвращать это значениеКак вернуть IEnumerable <T> Значение с использованием Datable?

IEnumerable<T> enrichment = null; 
var dataTable = new DataTable(); 

using (ReconContext context = new ReconContext()) 
{ 
    string sql = "SELECT * FROM " + DestinationTable + " WHERE LoadId =" + ExternalLoadId; 

    using (SqlDataAdapter adapater = new SqlDataAdapter(sql, context.Database.Connection.ConnectionString)) 
    { 
     adapater.Fill(dataTable); 
    } 
} 
return enrichment; 
+0

Непонятно, для чего «обогащение» или как оно относится к «DataTable». –

+0

Также неясно, что это связано с 'Linq-To-Entities' или с типом' T'. Вы хотите, чтобы общий метод преобразовывал 'DataTable' в' IEnumerable ', где' T' - это настраиваемый класс? Тогда есть уже доступные подходы, используя отражение, подобное [this] (http://stackoverflow.com/questions/12662318/how-to-convert-datatable-to-listt-using-reflections). –

+0

Это атака SQL Injection, ожидающая своего появления. Интересно, что произойдет, если я передам '2 OR 1 = 1 -' в качестве значения 'ExternalLoadId' –

ответ

1

Прежде всего вам не нужно использовать общее определение если вам это действительно нужно. Для общих условий вы можете легко использовать DataRow, как показано ниже;

IEnumerable<DataRow> enrichment = null; 
var dataTable = new DataTable(); 
using (ReconContext context = new ReconContext()) 
{ 
    string sql = "SELECT * FROM " + DestinationTable + " WHERE LoadId =" + ExternalLoadId; 

    using (SqlDataAdapter adapater = new SqlDataAdapter(sql, context.Database.Connection.ConnectionString)) 
    { 
     adapater.Fill(dataTable); 
    } 
} 

enrichment = dataTable.AsEnumerable(); 
return enrichment; 

Надеюсь, это поможет.

+0

Я. это правильно, но если моя функция, как этот общественный IEnumerable GeEnrichmendataByTableNameAndLoadId (строка DestinationTable, внутр ExternalLoadId) {} – user3062169

+0

Таким образом, это обстоятельство ваш SqlDataAdapter должен заполнить DataTable с типом T, если не вы должны создать метод, который преобразует вашу таблицу данных, чтобы строго указать тип T. –

-1

Ya это правильно, но если моя функция будет, как это так, как я могу использовать DataRow я хочу, чтобы из пут, которые я передам тип, который будет Retun

public IEnumerable<T> GeEnrichmendataByTableNameAndLoadId<T>(stringDestinationTable, int ExternalLoadId) 
+0

Это не ответ на вопрос. Пожалуйста, удалите. – Enigmativity

+0

Пожалуйста, отредактируйте исходный вопрос, если вы хотите предоставить дополнительную информацию. Также объясните причину, по которой вы пытаетесь выполнить необработанный SQL, когда вы уже используете Entity Framework –

0

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; 
+0

Я triyed это я получаю список пустых данных, не получающих строк у вас есть решение, как willl получить строки – user3062169

+0

Мой код не содержит данных таблиц или строк. Что вы на самом деле пытались сделать? Почему вы пытаетесь извлечь строки данных, когда вы уже используете ORM? –

+0

Эй вы можете увидеть свой первый контекст ответа.SqlQuery ? что я сказал вам – user3062169

 Смежные вопросы

  • Нет связанных вопросов^_^