Я сделал небольшой проект, который собираюсь использовать как ORM при разработке приложений для Windows CE 5.0. Работает он довольно медленно. Помогите пожалуйста оптимизировать работу моей маленькой ORM. Ссылка на github (для .net 3.5)
Больше всего проблем с методами, возвращающими данные из БД. Хотелось бы найти более производительный способ конвертации ответа в объекты.
Нужно вносить изменения, которые будут работать на .net 3.5 compact. Например Expression использовать нельзя.
Update: после замены алгоритма мапинга результатов запроса работать ORM стала быстрее, но она все равно намного медленнее EF, AutoDetectChangesEnabled стоит false
Единственным быстрым вариантом маппинга в .NET 3.5 была генерация делегатов для доступа. Можете взять за основу реализацию PropertyAccessor.Create из Linq To SQL:
Генерация делегата-геттера достаточна тривиальна.
Type dgetType = typeof(DGet<,>).MakeGenericType(objectType, pi.PropertyType);
// pi - ваш PropertyInfo
MethodInfo getMethod = pi.GetGetMethod(true);
Delegate dget = Delegate.CreateDelegate(dgetType, getMethod, true);
Для публичного сеттера (pi.CanWrite) все относительно просто:
dset = Delegate.CreateDelegate(
typeof(DSet<,>).MakeGenericType(objectType, pi.PropertyType),
pi.GetSetMethod(true),
true
);
С приватным сеттером сложнее, придется делать кодогенериацию через emit:
DynamicMethod mset = new DynamicMethod(
"xset_" + pi.Name,
typeof(void),
new Type[] { objectType.MakeByRefType(), pi.PropertyType },
true
);
ILGenerator gen = mset.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
if (!objectType.IsValueType) {
gen.Emit(OpCodes.Ldind_Ref);
}
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, pi.GetSetMethod(true));
gen.Emit(OpCodes.Ret);
drset = mset.CreateDelegate(typeof(DRSet<,>).MakeGenericType(objectType, pi.PropertyType));
DGet и DSet - это ожидаемые сигнатуры для делегатов (аналог современных Action<> и Func<>:
internal delegate V DGet<T, V>(T t);
internal delegate void DSet<T, V>(T t, V v);
Из делегатов выстраивайте цепочки для маппинга всего объекта и кэшируйте по типу, чтобы не генерировать все это при каждом маппинге.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости