private DbUnitTypeExpression SelectManyTranslate(TranslationContext context, MethodCallExpression exp) { var source = UnitTypeTranslate(context, exp.Arguments[0]); var target = context.Lambda <DbUnitTypeExpression>(delegate(Expression body) { return(UnitTypeTranslate(context, body)); }, exp.Arguments[1], source.Item); var item = context.Lambda <DbUnitItemTypeExpression>(delegate(Expression body) { return(UnitItemTypeTranslate(context, body) as DbUnitItemTypeExpression); }, exp.Arguments[2], source.Item, target.Item); if (item.ExpressionType == EExpressionType.DataItem || item.ExpressionType == EExpressionType.GroupItem) { item = new DbUnitItemContentExpression(item); } return(new DbCrossJoinExpression(source, target, item)); }
private DbUnitTypeExpression SelectTranslate(TranslationContext context, MethodCallExpression exp) { var source = UnitTypeTranslate(context, exp.Arguments[0]); return(context.Lambda <DbUnitTypeExpression>(delegate(Expression body) { var itemType = UnitItemTypeTranslate(context, body) as DbUnitItemTypeExpression; switch (itemType.ExpressionType) { case EExpressionType.DataItem: case EExpressionType.GroupItem: itemType = new DbUnitItemContentExpression(itemType); break; case EExpressionType.Select: //如果出现重复SELECT调用则自动合并 return ((DbSelectExpression)source).ReplaceItem(itemType); } return new DbSelectExpression(source, itemType); }, exp.Arguments[1], source.Item)); }
private DbUnitTypeExpression GropuAndJoinTranslate(TranslationContext context, MethodCallExpression exp, bool isgroup) { var source = UnitTypeTranslate(context, exp.Arguments[0]); var target = UnitTypeTranslate(context, exp.Arguments[1]); var left = context.Lambda <DbExpression>(delegate(Expression body) { return(ExpressionTranslate(context, body)); }, exp.Arguments[2], source.Item); var right = context.Lambda <DbExpression>(delegate(Expression body) { return(ExpressionTranslate(context, body)); }, exp.Arguments[3], target.Item); var rightitem = isgroup ? (DbExpression) new DbGroupSetExpression(target) : target.Item; var result = context.Lambda <DbUnitItemTypeExpression>(delegate(Expression body) { return(UnitItemTypeTranslate(context, body) as DbUnitItemTypeExpression); }, exp.Arguments[4], source.Item, rightitem); if (result.ExpressionType == EExpressionType.DataItem || result.ExpressionType == EExpressionType.GroupItem) { result = new DbUnitItemContentExpression(result); } if (isgroup) { var value = new DbGroupJoinExpression(source, target, left, right, result); ((DbGroupSetExpression)rightitem).Parent = value; return(value); } else { return(new DbInnerJoinExpression(source, target, left, right, result)); } }