Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        public virtual List <PropertyInfo> GetProperties()
        {
            List <PropertyInfo> rv = new List <PropertyInfo>
            {
                PropertyHelper.GetPropertyInfo(_directFieldExp)
            };

            return(rv);
        }