|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return p => false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static Expression<Func<TEntity, bool>> GetWhereExpression<TEntity>(this PropertyInfo propertyInfo, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | Type proType = propertyInfo.PropertyType; | 
|---|
|  |  |  | ConstantExpression constant = proType.ToString() == "System.String" | 
|---|
|  |  |  | ? Expression.Constant(propertyValue) : Expression.Constant(propertyValue.ToString().ChangeType(proType)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // DateTimeåªéæ©äºæ¥æçæ¶åèªå¨å¨ç»ææ¥æå ä¸å¤©ï¼ä¿®å¤DateTimeç±»åä½¿ç¨æ¥æåºé´æ¥è¯¢æ æ³æ¥è¯¢å°ç»ææ¥æçé®é¢ | 
|---|
|  |  |  | if ((proType == typeof(DateTime) || proType == typeof(DateTime?)) && expressionType == LinqExpressionType.LessThanOrEqual && propertyValue.ToString().Length == 10) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | constant = Expression.Constant(Convert.ToDateTime(propertyValue.ToString()).AddDays(1)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameter = parameter ?? Expression.Parameter(typeof(TEntity), "b"); | 
|---|
|  |  |  | //å建èç¹ç屿§p=>p.name å±æ§name | 
|---|
|  |  |  | MemberExpression memberProperty = Expression.PropertyOrField(parameter, propertyInfo.Name); | 
|---|
|  |  |  | UnaryExpression member = Expression.Convert(memberProperty, constant.Type); | 
|---|
|  |  |  | Expression<Func<TEntity, bool>> expression = p => false; | 
|---|
|  |  |  | switch (expressionType) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | //p=>p.propertyName == propertyValue | 
|---|
|  |  |  | case LinqExpressionType.Equal: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | //p=>p.propertyName != propertyValue | 
|---|
|  |  |  | case LinqExpressionType.NotEqual: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.NotEqual(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | //   p => p.propertyName > propertyValue | 
|---|
|  |  |  | case LinqExpressionType.GreaterThan: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThan(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | //   p => p.propertyName < propertyValue | 
|---|
|  |  |  | case LinqExpressionType.LessThan: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThan(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | // p => p.propertyName >= propertyValue | 
|---|
|  |  |  | case LinqExpressionType.ThanOrEqual: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | // p => p.propertyName <= propertyValue | 
|---|
|  |  |  | case LinqExpressionType.LessThanOrEqual: | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThanOrEqual(member, constant), parameter); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | //   p => p.propertyName.Contains(propertyValue) | 
|---|
|  |  |  | // p => !p.propertyName.Contains(propertyValue) | 
|---|
|  |  |  | case LinqExpressionType.Contains: | 
|---|
|  |  |  | case LinqExpressionType.NotContains: | 
|---|
|  |  |  | MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); | 
|---|
|  |  |  | constant = Expression.Constant(propertyValue, typeof(string)); | 
|---|
|  |  |  | if (expressionType == LinqExpressionType.Contains) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Call(member, method, constant), parameter); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | default: | 
|---|
|  |  |  | // | 
|---|
|  |  |  | expression = p => false; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return expression; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|