通过表达式代替lambda

全部! 默认情况下,我将尝试为扩展添加映射数据库列。我使用linq2db

这是我的方法

    public static void EntityWithDefaults<T>(this FluentMappingBuilder fluentMappingBuilder) {
        fluentMappingBuilder.Entity<T>().HasTableName(typeof(T).Name);
        var item = Expression.Parameter(typeof(T),typeof(T).Name);
        foreach (var prop in typeof(T).GetProperties()) {
            if (prop.Name == "ID")
                fluentMappingBuilder.Entity<T>().Property(x => Expression.Property(item,prop.Name)).IsIdentity().IsPrimaryKey();
            else
                fluentMappingBuilder.Entity<T>().Property(x => Expression.Property(item,prop.Name));
        }
    }

它没有用...但是如果我这样写-一切都很好

       fluentMappingBuilder.Entity<AppLogLong>()
       .HasTableName("AppLog")
       .Property(x => x.ID).IsPrimaryKey().IsIdentity()
       .Property(x => x.actionDate)
       .Property(x => x.actionId)
       .Property(x => x.EmployeeId)
       .Property(x => x.RequestType);

我认为我的问题是属性的表达式错误。请问您能帮我吗?

谢谢!

ioiuioh 回答:通过表达式代替lambda

x => x.IDx => Expression.Property(item,"ID")不同。

您可能想做的是:

foreach (var prop in typeof(T).GetProperties()) {
    var parameter = Expression.Parameter(typeof(T),"x");
    var property = Expression.Property(parameter,prop);
    var cast = Expression.Convert(property,typeof(object));
    var lambda = Expression.Lambda<Func<T,object>>(cast,parameter);
    if (prop.Name == "ID")
        fluentMappingBuilder.Entity<T>().Property(lambda).IsIdentity().IsPrimaryKey();
    else
        fluentMappingBuilder.Entity<T>().Property(lambda);
}

也就是说,我们必须自己构建整个LambdaExpression

本文链接:https://www.f2er.com/3037198.html

大家都在问