Отражение для генерации SQL в C #? - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть свой собственный ORM, но я замечаю, что он плохо преформируется, когда, например, я получаю 100k результатов.Для каждой итерации я отражаю каждый тип, его поля / свойства и классы, которые он использует (1 глубина).

Отражение класса 100k раз замедляется.Есть ли какая-то вещь, которую я могу использовать для генерации кода C #, поэтому мне не нужно использовать отражение?Я мог бы просто переписать важные запросы на выборку как обычный sql вместо того, чтобы использовать ORM, но я подумал, что сначала спросить, есть ли инструмент.Временное решениеКажется, что dapper.net имеет производительность, которая мне нужна для запросов, в то время как моя собственная система создает таблицы, вставляет и имеет дополнительные функции выполнения.Между этими двумя я думаю, что у меня есть ВСЕ, что мне нужно.(помните, мне нужна производительность на выборках, которые предлагает более щадящий вариант, мне не нужна производительность на вставках, если мой сайт не станет огромным)

Ответы [ 3 ]

2 голосов
/ 10 сентября 2011

Сам я бы использовал существующий ORM, но чтобы ответить на вопрос, вот простой пример установки свойства через динамически генерируемый установщик:

void Main()
{
    var setter = GetPropertySetter<MyClass>("MyProperty");

    var myClass = new MyClass();
    setter(myClass, "This was set by the setter");
    Console.WriteLine(myClass.MyProperty);
}

Action<T, object> GetPropertySetter<T>(string propertyName) 
{
    var property = typeof(T).GetProperty(propertyName);
    var target = Expression.Parameter(typeof(T));
    var value = Expression.Parameter(typeof(object));
    var assignment = Expression.Assign(Expression.MakeMemberAccess(target, property), Expression.Convert(value, property.PropertyType));
    var propertyGetterExpression = Expression.Lambda<Action<T, object>>(assignment, target, value);
    return propertyGetterExpression.Compile();
}

class MyClass {
    public string MyProperty { get; set; }
}

(Не забудьте using System.Linq.Expressions;)

1 голос
/ 16 сентября 2011

Dapper.NET отлично подходит для выбора и генерации + кода CLR компиляторов автоматически, чтобы стать действительно очень быстрым.

0 голосов
/ 10 сентября 2011

Я думаю, вы можете использовать кеш для хранения propertyInfo для каждого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...