我有自己的 ORM,但我注意到当我得到 100k 结果时它的表现很差。对于每次迭代,我都会反射(reflect)每种类型、其字段/属性以及它使用的类(1 深)。
对一个类进行 10 万次的反射(reflection)会变得很慢。是否有某种东西可以用来生成 C# 代码,这样我就不需要使用反射?我可以将重要的选择查询重写为常规 sql,而不是使用 ORM,但我想我首先要问是否有一个工具。
我正在使用 mysql 数据库。
-编辑- 临时解决方案。 dapper.net 似乎具有我需要的查询性能,而我自己的 orm 创建表、插入并具有附加执行功能。在两者之间,我想我拥有我需要的一切。 (请记住,我需要选择 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; }
}
(不要忘记使用 System.Linq.Expressions;
)
关于c# - C# 中的反射生成 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368890/