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));
        }
Exemple #3
0
        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));
            }
        }