コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }