在c#中生成SQL的反射
本文关键字:SQL 反射 | 更新日期: 2023-09-27 18:08:24
我有自己的ORM,但我注意到它在例如我获得100k结果时表现不佳。对于每个迭代,我反映每个类型,它的字段/属性和它使用的类(1深)。
反射一个类100k次会变慢。是否有某种东西我可以用来生成c#代码,所以我不需要使用反射?我可以只是重写重要的选择查询作为常规sql,而不是使用我的ORM,但我想我问是否有一个工具。
我正在使用mysql数据库。
-edit- Temp解决方案。Dapper.net似乎有我需要查询的性能,而我自己的表单创建表,插入和附加执行功能。在这两者之间,我想我拥有了我所需要的一切。(请记住,我需要的是dapper提供的选择性能,我不需要插入性能,除非我的网站变得巨大)
我自己会使用现有的ORM,但为了回答这个问题,这里有一个通过动态生成的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; }
}
(别忘了using System.Linq.Expressions;
)
衣冠楚楚。NET对于自动选择和生成+编译器的CLR代码非常有用,从而变得非常非常快。
我认为你可以使用缓存来保存每个类型的propertyInfo