using System.Linq.Expressions; namespace Common.Util { public class LamadaUtil where Dto : new() { private List m_lstExpression = null; private ParameterExpression m_Parameter = null; public LamadaUtil() { m_lstExpression = new List(); m_Parameter = Expression.Parameter(typeof(Dto), "x"); } //构造表达式,存放到m_lstExpression集合里面 public void GetExpression(string strPropertyName, object strValue, LamadaExpressionType expressType) { Expression expRes = null; MemberExpression member = Expression.PropertyOrField(m_Parameter, strPropertyName); if (expressType == LamadaExpressionType.Contains) { expRes = Expression.Call(member, typeof(string).GetMethods().Where(x => x.Name == "Contains").FirstOrDefault(), Expression.Constant(strValue)); } else if (expressType == LamadaExpressionType.Equal) { expRes = Expression.Equal(member, Expression.Constant(strValue, member.Type)); } else if (expressType == LamadaExpressionType.LessThan) { expRes = Expression.LessThan(member, Expression.Constant(strValue, member.Type)); } else if (expressType == LamadaExpressionType.LessThanOrEqual) { expRes = Expression.LessThanOrEqual(member, Expression.Constant(strValue, member.Type)); } else if (expressType == LamadaExpressionType.GreaterThan) { expRes = Expression.GreaterThan(member, Expression.Constant(strValue, member.Type)); } else if (expressType == LamadaExpressionType.GreaterThanOrEqual) { expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(strValue, member.Type)); } //else if (expressType == LamadaExpressionType.ParaseIn) //{ // expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(strValue, member.Type)); // public List ConvertToDesiredType(object list) { return ((IEnumerable)list).Select(item => new TruckiHesapEkstre { MutabakatDetayId = item.MutabakatDetayId, MutabakatVar = item.MutabakatVar, }).ToList(); } // foreach (var itemVal in valueArr) // { // Expression value = Expression.Constant(itemVal); // Expression right = Expression.Equal(key, Expression.Convert(value, key.Type)); // expression = Expression.Or(expression, right); // } //} //return expRes; m_lstExpression.Add(expRes); } //针对Or条件的表达式 public void GetExpression(string strPropertyName, List lstValue) { Expression expRes = null; MemberExpression member = Expression.PropertyOrField(m_Parameter, strPropertyName); foreach (var oValue in lstValue) { if (expRes == null) { expRes = Expression.Equal(member, Expression.Constant(oValue, member.Type)); } else { expRes = Expression.Or(expRes, Expression.Equal(member, Expression.Constant(oValue, member.Type))); } } m_lstExpression.Add(expRes); } //得到Lamada表达式的Expression对象 public Expression> GetLambda() { Expression whereExpr = null; foreach (var expr in this.m_lstExpression) { if (whereExpr == null) whereExpr = expr; else whereExpr = Expression.And(whereExpr, expr); } if (whereExpr == null) return null; return Expression.Lambda>(whereExpr, m_Parameter); } } //用于区分操作的枚举 public enum LamadaExpressionType { Contains,//like Equal,//等于 LessThan,//小于 LessThanOrEqual,//小于等于 GreaterThan,//大于 GreaterThanOrEqual,//大于等于 ParaseIn } }