2015-01-02 1 views
0

Привет всем, я пытаюсь написать код, который может получить информацию о таблице для таблицы с (string) tableName, но я получаю ошибку, когда пытаюсь поместить значение в словарь. P.S: Я создал модель EF DB.return raw sql as dictionary

public Dictionary<string, List<object>> GetTableInformation(string tableName, FinkonaDatabaseType type) 
    { 
     Dictionary<string, List<object>> _returnableDictionary = new Dictionary<string, List<object>>(); 
     PropertyInfo prop = optimumEntities.GetType().GetProperty(tableName); 
     Type tableType = prop.PropertyType.GenericTypeArguments[0]; 
     var items = optimumEntities.Database.SqlQuery(tableType, "SELECT * FROM " + tableName); 

     foreach (var item in items) 
     { 
      foreach (PropertyInfo info in item.GetType().GetProperties()) 
      { 
       if (!_returnableDictionary.ContainsKey(info.Name)) 
       { 
        _returnableDictionary.Add(info.Name, new List<object>()); 
       } 
       _returnableDictionary[info.Name].Add(info.GetValue(info, null)); 
       // System.Reflection.TargetException, Object does not match target type. 
      } 
     } 
     return _returnableDictionary; 
    } 
+0

Просто уточнить, вы хотите, чтобы выбрать все элементы из конкретной таблицы, но предоставляя только имя таблицы, но получить обратно все записи для это как «объект»? –

+0

@DominicZukiewicz Да, вы правы. :) Но без знания каких-либо типов: S –

+0

Как вы решаете, что такое ключ? Первая колонка ???? –

ответ

0

Использование ADO.NET DataTables здесь будет проще, поскольку EF используется для сильной ввода данных. Поскольку вы не слишком беспокоитесь о возвращении типов данных, DataTable будет легче ориентироваться.

Вот примеры этого:

public Dictionary<string, List<object>> GetTableInformation(string tableName, FinkonaDatabaseType type) 
{ 
    var sqlText = "SELECT * from " + tableName; 
    DataTable dt = new DataTable(); 

    // Use DataTables to extract the whole table in one hit 
    using(SqlDataAdapter da = new SqlDataAdapter(sqlText, optimumEntities.Database.ConnectionString) 
    { 
     da.Fill(dt); 
    } 

    var tableData = new Dictionary<string, List<object>>(); 

    // Go through all columns, retrieving their names and populating the rows 
    foreach(DataColumn dc in dt.Columns) 
    { 
     string columnName = dc.Name; 
     rowData = new List<object>(); 
     tableData.Add(columnName, rowData); 

     foreach(DataRow dr in dt.Rows) 
     { 
     rowData.Add(dr[columnName]); 
     } 
    } 

    return tableData; 
} 
+0

Спасибо, что мне было нужно :) –