2013-05-31 4 views
0

Каков наилучший способ сопоставления реляционной таблицы, которая содержит больше , чем 150 столбцов. Я не хочу использовать стороннюю структуру или сущность. if Я использую data-reader, очень сложно написать все столбцы, а преобразовать его в соответствующий тип.Отображение реляционных объектов C#

Есть ли простой способ сделать это или это единственный способ?

SqlDataReader _dr = _sqlCom.ExecuteReader() ; 

     Info inObj= new Info(); 


     while (_dr.Read()) 
     { 

      inObj.a= (int)_dr["a"]; 
      inObj.b= (int)_dr["b"]; 
      inObj.c= (int)_dr["c"]; 
      inObj.d= (int)_dr["d"]; 
      inObj.e= (int)_dr["e"]; 
      ..... 

      ...... 
     } 
+0

Там в Micro-ORM называется [PetaPOCO] (HTTP: // WWW. toptensoftware.com/petapoco/). Вы можете использовать это, если вы не хотите реального ORM. в противном случае вы должны закодировать все самостоятельно или использовать отражение, которое так же дерьмо и медленно. –

ответ

0

Вы можете использовать отражение, если вы в порядке с поражением производительности. Нечто подобное должно работать:

SqlDataReader reader = ...; 
var propertyMappings = typeof (Info).GetProperties(BindingFlags.Instance | BindingFlags.Public) 
    .Select(p => new {Property = p, Ordinal = reader.GetOrdinal(p.Name)}) 
    .ToList(); 
while (reader.Read()) 
{ 
    var info = new Info(); 
    foreach (var propertyMapping in propertyMappings) 
     propertyMapping.Property.SetValue(info, reader[propertyMapping.Ordinal]); 
} 
+0

есть большая проблема с производительностью – FatalError

+0

Я не знаю точных цифр, но это не несущественно. Во многих ситуациях это не проблема, но если вы обрабатываете 100K строк с 10 столбцами, это может создать проблему для вас. Возможно, вам придется провести собственное тестирование. Обратите внимание, что вышеприведенный код вытягивает порядковый номер для каждого свойства перед вводом цикла Read(). Это улучшит производительность по строковым вызовам ["column"]. Поэтому, если вы хотите сравнить яблоки с яблоками во время выполнения собственных тестов производительности, вам нужно будет изменить свой код, чтобы также использовать ординалы. –

0

Если вы хотите сделать это для вас, вы должны будете использовать либо ОРМ, есть некоторые хорошие там, как Dapper, или использовать отражение (но будет медленнее). В противном случае вам нужно все это обработать самостоятельно. Однако вместо уродливого литья, вы могли бы написать несколько строк кода, чтобы избавиться от отливки, и, вероятно, работать лучше

SqlDataReader _dr = _sqlCom.ExecuteReader() ; 


Info inObj = new Info(); 

if (!_dr.HasRows) { return; } 

int aPosition = _dr.GetOrdinal("a");} 
int bPosition = _dr.GetOrdinal("b"); 
int cPosition = _dr.GetOrdinal("c"); 
int dPosition = _dr.GetOrdinal("d"); 
int ePosition = _dr.GetOrdinal("e"); 

while (_dr.Read()) 
{ 
    inObj.a = _dr.GetInt32(aPosition); 
    inObj.b = _dr.GetInt32(bPosition); 
    inObj.c = _dr.GetInt32(cPosition); 
    inObj.d = _dr.GetInt32(dPosition); 
    inObj.e = _dr.GetInt32(ePosition); 

    ..... 

    ...... 
}