痕迹g 表达式树
public static Expression<Func<T, bool>> GenerateQueryExp<T>(T searchModel) where T : class, new()
{
List<MethodCallExpression> mcList = new List<MethodCallExpression>();
List<BinaryExpression> mcList2 = new List<BinaryExpression>();
Type type = searchModel.GetType();
ParameterExpression parameterExpression = Expression.Parameter(type, "x");
var pros = type.GetProperties();
foreach (var t in pros)
{
var objValue = t.GetValue(searchModel, null);
if (objValue != null && t.Name != "isid")
{
Expression proerty = Expression.Property(parameterExpression, t);
ConstantExpression constantExpression = Expression.Constant(objValue, t.PropertyType);
if (t.PropertyType.Name != "Int32" && t.PropertyType.Name != "ICollection`1" && t.PropertyType.Name != "Nullable`1")
mcList.Add(Expression.Call(proerty, typeof(string).GetMethod("Contains"), new Expression[] { constantExpression }));
else if (t.PropertyType.Name == "Int32"&& !objValue.ToString().Equals("0"))
{
mcList.Add(Expression.Call(proerty, typeof(Int32).GetMethod("Equals", new Type[]
{ typeof(Int32) }), new Expression[] { constantExpression }));
}
else if (t.PropertyType.Name == "Nullable`1" && !objValue.ToString().Equals("0"))
{
mcList2.Add(Expression.Equal(proerty, constantExpression));
}
}
}
if (mcList.Count == 0)
{
if(mcList2.Count == 0)
return Expression.Lambda<Func<T, bool>>(Expression.Constant(true, typeof(bool)), new ParameterExpression[] { parameterExpression });
else
return Expression.Lambda<Func<T, bool>>(MethodCall(mcList2), new ParameterExpression[] { parameterExpression });
}
else
return Expression.Lambda<Func<T, bool>>(MethodCall(mcList), new ParameterExpression[] { parameterExpression });
}