c# - C# 中的反射生成 SQL?

标签 c# mysql orm

我有自己的 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/

相关文章:

c# - Streamwriter 有时会在一行中间切断我的最后几行?

c# - 将 app.config 中的值从一个控制台应用程序传递到一个类库

c# - ASP.Net MVC : Can the AuthorizeAttribute be overriden?

php - 用页码分页?

sql - 使用 group by 和 order by 的 sql 查询问题

entity-framework - 每种模板类型的预期用途、优缺点是什么?

mysql - Django ORM 处理 MySQL BIT(1) 字段

c# - CA1303 警告 - 方法将文字字符串作为参数传递

php - 循环遍历数组并按值删除/取消设置

php - 如何显示ORM组装的查询?