user34537
user34537

Reputation:

Reflection to generate SQL in C#?

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

Answers (3)

user34537
user34537

Reputation:

Dapper.NET is great for selects and generates+compilers CLR code automatically to become really really fast.

Upvotes: 1

Low Flying Pelican
Low Flying Pelican

Reputation: 6054

I think you can you use a cache to keep propertyInfo for each type.

Upvotes: 0

Kirk Woll
Kirk Woll

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

Related Questions