private void VisitSelectStatements(List <MethodCallExpression> callChain, Type typeResult, IEnumerable <string> otherVariables) { string[] names = new[] { nameof(q.Select) }; List <MethodCallExpression> tmp = callChain.Where(p => names.Contains(p.Method.Name)).ToList(); SelectQueryTranslator s = new SelectQueryTranslator(typeResult, otherVariables); foreach (MethodCallExpression item in tmp) { s.Accept(item); callChain.Remove(item); } SelectPart = s.Statement; }
protected override Expression VisitMethodCall(MethodCallExpression node) { var name = node.Method.Name; LambdaExpression lambdaExpression; switch (name) { case "Where": lambdaExpression = GetLambdaExpression(node); var whereTranslator = new WhereQueryTranslator(); WhereClause = whereTranslator.Translate(lambdaExpression); Visit(node.Arguments[0]); break; case "FirstOrDefault": FirstOrDefaultClause = "TOP 1 *"; Visit(node.Arguments[0]); break; case "ThenBy": case "OrderBy": case "OrderByDescending": case "ThenByDescending": var sortingType = name.Contains("Descending") ? SortingType.DESC : SortingType.ASC; lambdaExpression = GetLambdaExpression(node); var orderByTranslator = new OrderByQueryTranslator(sortingType); orderByClauses_.Add(orderByTranslator.Translate(lambdaExpression)); Visit(node.Arguments[0]); break; case "Select": lambdaExpression = GetLambdaExpression(node); var selectTranslator = new SelectQueryTranslator(); SelectClause = selectTranslator.Translate(lambdaExpression); Visit(node.Arguments[0]); break; default: break; } return(node); }