/// <summary> /// 根据设定的字段,生成查询重复数据的Lambda,最终返回类似 x=>x.property == val的lambda /// </summary> /// <param name="Entity">要验证字段的实体类</param> /// <param name="para">ParameterExpression</param> /// <returns></returns> public virtual Expression GetExpression(T Entity, ParameterExpression para) { var propName = PropertyHelper.GetPropertyName(_directFieldExp); var prop = PropertyHelper.GetPropertyInfo(_directFieldExp); var func = _directFieldExp.Compile(); var val = func.Invoke(Entity); ////如果字段值为null则跳过,因为一般情况下null值不会被认为重复 //if (val == null) //{ // return res; //} //如果字段值是空字符串,则跳过 if (val is string && val.ToString() == string.Empty) { var requiredAttrs = prop.GetCustomAttributes(typeof(RequiredAttribute), false).ToList(); if (requiredAttrs == null || requiredAttrs.Count == 0) { return(null); } else { var requiredAtt = requiredAttrs[0] as RequiredAttribute; if (requiredAtt.AllowEmptyStrings == true) { return(null); } } } //生成一个表达式,类似于 x=>x.field == val var splits = propName.Split('.'); var idproperty = typeof(T).GetProperties().Where(x => x.Name == splits[0]).FirstOrDefault(); Expression left = Expression.Property(para, idproperty); for (int i = 1; i < splits.Length; i++) { var tempproperty = typeof(T).GetProperties().Where(x => x.Name == splits[i]).FirstOrDefault(); left = Expression.Property(left, tempproperty); } if (val != null && left.Type.IsGeneric(typeof(Nullable <>))) { left = Expression.Property(left, "Value"); } if (left.Type == typeof(string)) { left = Expression.Call(left, typeof(String).GetMethod("Trim", Type.EmptyTypes)); } if (val is string) { val = val.ToString().Trim(); } var right = Expression.Constant(val); var equal = Expression.Equal(left, right); return(equal); }
public virtual List <PropertyInfo> GetProperties() { List <PropertyInfo> rv = new List <PropertyInfo> { PropertyHelper.GetPropertyInfo(_directFieldExp) }; return(rv); }