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)); } }
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 }); } } } }