How to create LINQ Expression Tree to select an anonymous type

前端 未结 9 778
夕颜
夕颜 2020-11-22 12:12

I would like to generate the following select statement dynamically using expression trees:

var v = from c in Countries
        where c.City == \"London\"
           


        
9条回答
  •  时光说笑
    2020-11-22 12:43

    Maybe a bit late but may help to someone.

    You Can generate dynamic select by call DynamicSelectGenerator in select from an entity.

    public static Func DynamicSelectGenerator()
                {
                    // get Properties of the T
                    var fields = typeof(T).GetProperties().Select(propertyInfo => propertyInfo.Name).ToArray();
    
                // input parameter "o"
                var xParameter = Expression.Parameter(typeof(T), "o");
    
                // new statement "new Data()"
                var xNew = Expression.New(typeof(T));
    
                // create initializers
                var bindings = fields.Select(o => o.Trim())
                    .Select(o =>
                    {
    
                        // property "Field1"
                        var mi = typeof(T).GetProperty(o);
    
                        // original value "o.Field1"
                        var xOriginal = Expression.Property(xParameter, mi);
    
                        // set value "Field1 = o.Field1"
                        return Expression.Bind(mi, xOriginal);
                    }
                );
    
                // initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
                var xInit = Expression.MemberInit(xNew, bindings);
    
                // expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
                var lambda = Expression.Lambda>(xInit, xParameter);
    
                // compile to Func
                return lambda.Compile();
            }
    

    And use by this code:

    var result = dbContextInstancs.EntityClass.Select(DynamicSelectGenerator());
    

提交回复
热议问题