// <summary>
        // The only entry point.
        // Rewrites the given tree by replacing expressions that are not directly supported on SQL Server 2000
        // with alterntive translations.
        // </summary>
        // <param name="originalTree"> The tree to rewrite </param>
        // <returns> The new tree </returns>
        internal static DbQueryCommandTree Rewrite(DbQueryCommandTree originalTree)
        {
            DebugCheck.NotNull(originalTree);
            var rewriter = new Sql8ExpressionRewriter(originalTree.MetadataWorkspace);
            var newQuery = rewriter.VisitExpression(originalTree.Query);

#if DEBUG
            return(new DbQueryCommandTree(originalTree.MetadataWorkspace, originalTree.DataSpace, newQuery));
#else
            return(new DbQueryCommandTree(originalTree.MetadataWorkspace, originalTree.DataSpace, newQuery, validate: false));
#endif
        }
        /// <summary>
        /// The only entry point. 
        /// Rewrites the given tree by replacing expressions that are not directly supported on SQL Server 2000
        /// with alterntive translations.
        /// </summary>
        /// <param name="originalTree">The tree to rewrite</param>
        /// <returns>The new tree</returns>
        internal static DbQueryCommandTree Rewrite(DbQueryCommandTree originalTree)
        {
            Debug.Assert(originalTree != null, "OriginalTree is null");
            var rewriter = new Sql8ExpressionRewriter(originalTree.MetadataWorkspace);
            var newQuery = rewriter.VisitExpression(originalTree.Query);

#if DEBUG
            return new DbQueryCommandTree(originalTree.MetadataWorkspace, originalTree.DataSpace, newQuery);
#else
            return new DbQueryCommandTree(originalTree.MetadataWorkspace, originalTree.DataSpace, newQuery, validate: false);
#endif
        }
 private static bool HasMatchInList(
     DbPropertyExpression expr,
     IList <DbPropertyExpression> list,
     string exprBindingVariableName,
     string listExpressionsBindingVariableName)
 {
     for (int index = 0; index < list.Count; ++index)
     {
         if (Sql8ExpressionRewriter.AreMatching(expr, list[index], exprBindingVariableName, listExpressionsBindingVariableName))
         {
             list.RemoveAt(index);
             return(true);
         }
     }
     return(false);
 }
        private static bool RemoveNonSortProperties(
            IList <DbPropertyExpression> list1,
            IList <DbPropertyExpression> list2,
            IList <DbPropertyExpression> sortList,
            string list1BindingVariableName,
            string sortExpressionsBindingVariableName)
        {
            bool flag = false;

            for (int index = list1.Count - 1; index >= 0; --index)
            {
                if (!Sql8ExpressionRewriter.HasMatchInList(list1[index], sortList, list1BindingVariableName, sortExpressionsBindingVariableName))
                {
                    list1.RemoveAt(index);
                    list2.RemoveAt(index);
                    flag = true;
                }
            }
            return(flag);
        }
        private static bool AreMatching(
            DbPropertyExpression expr1,
            DbPropertyExpression expr2,
            string expr1BindingVariableName,
            string expr2BindingVariableName)
        {
            if (expr1.Property.Name != expr2.Property.Name || expr1.Instance.ExpressionKind != expr2.Instance.ExpressionKind)
            {
                return(false);
            }
            if (expr1.Instance.ExpressionKind == DbExpressionKind.Property)
            {
                return(Sql8ExpressionRewriter.AreMatching((DbPropertyExpression)expr1.Instance, (DbPropertyExpression)expr2.Instance, expr1BindingVariableName, expr2BindingVariableName));
            }
            DbVariableReferenceExpression instance1 = (DbVariableReferenceExpression)expr1.Instance;
            DbVariableReferenceExpression instance2 = (DbVariableReferenceExpression)expr2.Instance;

            if (string.Equals(instance1.VariableName, expr1BindingVariableName, StringComparison.Ordinal))
            {
                return(string.Equals(instance2.VariableName, expr2BindingVariableName, StringComparison.Ordinal));
            }
            return(false);
        }
        private DbExpression TransformIntersectOrExcept(
            DbExpression left,
            DbExpression right,
            DbExpressionKind expressionKind,
            IList <DbPropertyExpression> sortExpressionsOverLeft,
            string sortExpressionsBindingVariableName)
        {
            bool flag1 = expressionKind == DbExpressionKind.Except || expressionKind == DbExpressionKind.Skip;
            bool flag2 = expressionKind == DbExpressionKind.Except || expressionKind == DbExpressionKind.Intersect;
            DbExpressionBinding          input                   = left.Bind();
            DbExpressionBinding          expressionBinding       = right.Bind();
            IList <DbPropertyExpression> propertyExpressionList1 = (IList <DbPropertyExpression>) new List <DbPropertyExpression>();
            IList <DbPropertyExpression> propertyExpressionList2 = (IList <DbPropertyExpression>) new List <DbPropertyExpression>();

            this.FlattenProperties((DbExpression)input.Variable, propertyExpressionList1);
            this.FlattenProperties((DbExpression)expressionBinding.Variable, propertyExpressionList2);
            if (expressionKind == DbExpressionKind.Skip && Sql8ExpressionRewriter.RemoveNonSortProperties(propertyExpressionList1, propertyExpressionList2, sortExpressionsOverLeft, input.VariableName, sortExpressionsBindingVariableName))
            {
                expressionBinding = Sql8ExpressionRewriter.CapWithProject(expressionBinding, propertyExpressionList2);
            }
            DbExpression dbExpression1 = (DbExpression)null;

            for (int index = 0; index < propertyExpressionList1.Count; ++index)
            {
                DbExpression right1 = (DbExpression)propertyExpressionList1[index].Equal((DbExpression)propertyExpressionList2[index]).Or((DbExpression)propertyExpressionList1[index].IsNull().And((DbExpression)propertyExpressionList2[index].IsNull()));
                dbExpression1 = index != 0 ? (DbExpression)dbExpression1.And(right1) : right1;
            }
            DbExpression dbExpression2 = (DbExpression)expressionBinding.Any(dbExpression1);
            DbExpression predicate     = !flag1 ? dbExpression2 : (DbExpression)dbExpression2.Not();
            DbExpression dbExpression3 = (DbExpression)input.Filter(predicate);

            if (flag2)
            {
                dbExpression3 = (DbExpression)dbExpression3.Distinct();
            }
            return(dbExpression3);
        }
        internal static DbQueryCommandTree Rewrite(DbQueryCommandTree originalTree)
        {
            DbExpression query = new Sql8ExpressionRewriter(originalTree.MetadataWorkspace).VisitExpression(originalTree.Query);

            return(new DbQueryCommandTree(originalTree.MetadataWorkspace, originalTree.DataSpace, query, false));
        }