Reputation:
I have my own ORM but i notice it preforms poorly when for example i get 100k results. For each iteration i reflect each type, its fields/properties and classes it uses (1 deep).
Reflecting a class 100k times get slow. Is there some kind of thing i can use to generate C# code so i dont need to use reflection? I could just rewrite the important select queries as regular sql instead of using my ORM but i thought i ask if there is a tool first.
I am using a mysql db.
-edit- Temp solution. dapper.net seems to have the performance i need on queries while my own orm creates tables, inserts and has addition execute features. Between the two i think i have EVERYTHING i need. (remember i need performance on selects which dapper offers, i dont need performance on inserts unless my site becomes huge)
Upvotes: 0
Views: 2021
Reputation:
Dapper.NET is great for selects and generates+compilers CLR code automatically to become really really fast.
Upvotes: 1
Reputation: 6054
I think you can you use a cache to keep propertyInfo for each type.
Upvotes: 0
Reputation: 77616
Myself, I'd use an existing ORM, but to answer the question, here's a simple example of setting a property via a dynamically generated setter:
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; }
}
(Don't forget using System.Linq.Expressions;
)
Upvotes: 2