LINQ : Dynamic select

前端 未结 10 600
北荒
北荒 2020-11-22 05:26

Consider we have this class :

    public  class Data
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field         


        
10条回答
  •  长情又很酷
    2020-11-22 05:32

    In addition for Nicholas Butler and the hint in comment of Matt(that use T for type of input class), I put an improve to Nicholas answer that generate the property of entity dynamically and the function does not need to send field as parameter.

    For Use add class as below:

    public static class Helpers
    {
        public static Func DynamicSelectGenerator(string Fields = "")
        {
            string[] EntityFields;
            if (Fields == "")
                // get Properties of the T
                EntityFields = typeof(T).GetProperties().Select(propertyInfo => propertyInfo.Name).ToArray();
            else
                EntityFields = Fields.Split(',');
    
            // input parameter "o"
            var xParameter = Expression.Parameter(typeof(T), "o");
    
            // new statement "new Data()"
            var xNew = Expression.New(typeof(T));
    
            // create initializers
            var bindings = EntityFields.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();
        }
    }
    

    The DynamicSelectGenerator method get entity with type T, this method have optional input parameter Fields that if you want to select special field from entity send as a string such as "Field1, Field2" and if you don't send anything to method, it returns all of the fields of entity, you could use this method as below:

     using (AppDbContext db = new AppDbContext())
                {
                    //select "Field1, Field2" from entity
                    var result = db.SampleEntity.Select(Helpers.DynamicSelectGenerator("Field1, Field2")).ToList();
    
                    //select all field from entity
                    var result1 = db.SampleEntity.Select(Helpers.DynamicSelectGenerator()).ToList();
                }
    

    (Assume that you have a DbContext with name AppDbContext and the context have an entity with name SampleEntity)

提交回复
热议问题