Beispiel #1
0
 private void SetOrderByForMember(MemberExpression memberExp, LambdaExpression fullExpression, SortType sortType)
 {
     if (memberExp.Expression.NodeType == ExpressionType.MemberAccess)
     {
         //分组查询
         if (IsGroupBy)
         {
             var descriptor = GroupByPropertyList.FirstOrDefault(m => m.Alias == memberExp.Member.Name);
             if (descriptor != null)
             {
                 var colName = GetColumnName(descriptor.Name, descriptor.JoinDescriptor);
                 Sorts.Add(new Sort(colName, sortType));
             }
         }
         else
         {
             if (memberExp.Expression.Type.IsString())
             {
                 var memberName = memberExp.Member.Name.Equals("Length");
                 //解析Length函数
                 if (memberName)
                 {
                     var funcName = _sqlAdapter.FuncLength;
                     var colName  = GetColumnName(memberExp.Expression as MemberExpression, fullExpression);
                     Sorts.Add(new Sort($"{funcName}({colName})", sortType));
                 }
             }
         }
     }
     else
     {
         var colName = GetColumnName(memberExp, fullExpression);
         Sorts.Add(new Sort(colName, sortType));
     }
 }
Beispiel #2
0
        public void SetGroupBy(Expression expression)
        {
            IsGroupBy = true;
            if (expression != null)
            {
                GroupBy = expression as LambdaExpression;
                var lambda = expression as LambdaExpression;
                if (lambda != null && lambda.Body.NodeType != ExpressionType.New)
                {
                    throw new ArgumentException("分组条件必须使用匿名类new{}");
                }

                if (lambda?.Body is NewExpression newExp)
                {
                    for (var i = 0; i < newExp.Members.Count; i++)
                    {
                        var alias = newExp.Members[i].Name;
                        if (newExp.Arguments[i] is MemberExpression member)
                        {
                            var parameter      = member.Expression as ParameterExpression;
                            var joinDescriptor = JoinDescriptors.FirstOrDefault(m => parameter != null && m.EntityDescriptor.EntityType == parameter.Type);

                            GroupByPropertyList.Add(new GroupByJoinDescriptor
                            {
                                Name           = member.Member.Name,
                                Alias          = alias,
                                JoinDescriptor = joinDescriptor
                            });
                        }
                    }
                }
            }
            else
            {
                foreach (var joinDescriptor in JoinDescriptors)
                {
                    foreach (var column in joinDescriptor.EntityDescriptor.Columns)
                    {
                        GroupByPropertyList.Add(new GroupByJoinDescriptor
                        {
                            Name           = column.Name,
                            Alias          = column.PropertyInfo.Name,
                            JoinDescriptor = joinDescriptor
                        });
                    }
                }
            }
        }