Witam.
Pytanko mam, ponieważ borykam się z dziwnym problemem. Wczoraj wieczorem pobieranie danych z bazy (400 rekordów) trwało 11 sekund. Dzisiaj rano to samo zapytanie, ten sam sposób pobierania trwa max. 700+ milisekund... Zbaraniałem. Chciałem już dzwonić do specjalisty, bo chyba mam zwidy. Nie mogę używać EF, to nie moja baza, robie tylko swój program pod bazę, która w każdej chwili może się zmienić, a EF tego nie lubi. Znalazłem w internetach metodę, która robi takie prowizoryczne pobieranie danych z SQL i mapuje do obiektów:
private static List<T> DataReaderMapToList<T>(SqlDataReader dr)
{
List<T> list = new List<T>();
T obj = default(T);
while (dr.Read())
{
obj = Activator.CreateInstance<T>();
foreach (PropertyInfo prop in obj.GetType().GetProperties())
{
var test = Nullable.GetUnderlyingType(prop.PropertyType);
if (!object.Equals(dr[prop.Name], DBNull.Value))
{
var nullableType = Nullable.GetUnderlyingType(prop.PropertyType);
prop.SetValue(obj, Convert.ChangeType(dr[prop.Name], nullableType ?? prop.PropertyType), null);
}
}
list.Add(obj);
}
return list;
}
public static List<T> GetData<T>(string connectionString, string query)
{
List<T> srw = new List<T>();
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = query;
using (SqlDataReader dr = cmd.ExecuteReader())
{
srw = DataReaderMapToList<T>(dr);
}
}
}
return srw;
}
Tragedii z tym rozwiązaniem nie ma, ale mam kilka problemów, a w tym właśnie wydajność:
- Mogę mieć tylko propertki o takiej nazwie jak kolumna - mogę sobie w query nazwać kolumny, ale na tym polega uniwersalność, żeby tego nie robić
- Nie mogę mieć zagnieżdżonych obiektów - sam też nie wiem jak to rozwiązać
public class Obiekt1
{
public int ID {get;set;}
public InnyObiekt Inny {get;set;}
}
- Wydajność jest pod znakiem zapytania, raz robi szybko, raz długo.
Ograniczam już dane datami, ale i tak wydaje mi się, że 400 rekordów to jest strasznie mało.
Co mogę z tym zrobić?
Jak poprawić wydajność i funkcjonalność?
Czy zagnieżdżone obiekty mogą powodować spadek wydajności?
Łączyć to jakąś klasą nadrzędną i to wysyłać do klienta?