/// <summary> /// Convert expression to code. /// </summary> /// <param name="expression">Expression.</param> /// <param name="converter">Expression converter.</param> /// <returns>Parts.</returns> public override ICode Convert(MethodCallExpression expression, ExpressionConverter converter) { //ALL, DISTINCT, TOP int expressionIndex = expression.SkipMethodChain(0); var selectParts = new ICode[expression.Arguments.Count - expressionIndex]; selectParts[0] = string.IsNullOrEmpty(Name) ? SelectClause : Name.ToCode(); for (int i = 0; i < selectParts.Length - 1; i++, expressionIndex++) { selectParts[i + 1] = converter.ConvertToCode(expression.Arguments[expressionIndex]); } var select = LineSpace(selectParts); //select elemnts. var selectTargets = expression.Arguments[expression.Arguments.Count - 1]; //* if (typeof(AsteriskElement).IsAssignableFromEx(selectTargets.Type)) { select.Add("*".ToCode()); return(new SelectClauseCode(select)); } //new []{ a, b, c} recursive. else if (selectTargets.Type.IsArray) { var newArrayExp = selectTargets as NewArrayExpression; if (newArrayExp != null) { var array = new ICode[newArrayExp.Expressions.Count]; for (int i = 0; i < array.Length; i++) { array[i] = converter.ConvertToCode(newArrayExp.Expressions[i]); } var coreCode = new VCode(select, new VCode(array) { Indent = 1, Separator = "," }); return(new SelectClauseCode(coreCode)); } } //new { item = db.tbl.column } { var createInfo = ObjectCreateAnalyzer.MakeObjectCreateInfo(selectTargets); var elements = new ICode[createInfo.Members.Length]; for (int i = 0; i < elements.Length; i++) { elements[i] = ConvertSelectedElement(converter, createInfo.Members[i]); } var coreCode = new VCode(select, new VCode(elements) { Indent = 1, Separator = "," }); return(new SelectClauseCode(coreCode)); } }
/// <summary> /// Convert expression to code. /// </summary> /// <param name="expression">Expression.</param> /// <param name="converter">Expression converter.</param> /// <returns>Parts.</returns> public override ICode Convert(MethodCallExpression expression, ExpressionConverter converter) { var name = FromConverterAttribute.GetSubQuery(expression.Arguments[0]); var coreType = expression.Arguments[0].Type.GetGenericArgumentsEx()[0]; var info = ObjectCreateAnalyzer.MakeObjectCreateInfo(coreType); //TODO return(new WithEntriedCode(Line(name.ToCode(), Blanket(info.Members.Select(e => e.Name.ToCode()).ToArray())), new[] { name })); }