linq dynamic expression c#

public EmpDetail RetrieveByFilter(int no, List<Filter> filters)        public EmpDetail RetrieveByFilter(int no, List<Filter> filters)        {            try            {                Expression<Func<MOdelCLass, bool>> WhereClause = DynamicLinqExpression<ModelCLass>(null, filters); } }

 

private static Expression<Func<T, bool>> DynamicLinqExpression<T>(int? postId, List<Filter> filters) where T : class        {            Expression<Func<T, bool>> whereClause = null;            var parameter = Expression.Parameter(typeof(T), “p”);            Expression filterExpression = null;            if (typeof(T).Name == “community_post”)            {                filters.Clear();                if (postId != null && postId != 0)                {                    filters.Add(new Filter { PropertyName = “is_active”, Value = true, Operation = “Equal”, JoinType = “AND” });                }                else                {                    filters.Add(new Filter { PropertyName = “is_notice”, Value = false, Operation = “Equal”, JoinType = “AND” });                }            }
foreach (var filterItem in filters)            {                var member = Expression.Property(parameter, filterItem.PropertyName);                var propertyType = ((PropertyInfo)member.Member).PropertyType;                var converter = TypeDescriptor.GetConverter(propertyType);
if (!converter.CanConvertFrom(typeof(string)))                    throw new NotSupportedException();
var propertyValue = converter.ConvertFromInvariantString(filterItem.Value.ToString());                var constant = Expression.Constant(propertyValue);                var valueExpression = Expression.Convert(constant, propertyType);                Expression equality = null;                switch (filterItem.Operation)                {                    case “Equal”:                        equality = Expression.Equal(member, valueExpression);                        break;                    case “LessThan”:                        equality = Expression.LessThan(member, valueExpression);                        break;                }                if (filterExpression == null)                {                    filterExpression = equality;                }                else                {                    switch (filterItem.JoinType)                    {                        case “AND”:                            filterExpression = Expression.And(filterExpression, equality);                            break;                        case “OR”:                            filterExpression = Expression.Or(filterExpression, equality);                            break;                    }                }            }
if (filterExpression != null)            {                whereClause = Expression.Lambda<Func<T, bool>>(filterExpression, parameter);            }
return whereClause;        }

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s