Пример #1
0
            public void EliminateJoins(SelectExpression selectExpression)
            {
                if (selectExpression == null)
                {
                    return;
                }
                for (var i = selectExpression.Tables.Count - 1; i >= 0; i--)
                {
                    var tableExpression = selectExpression.Tables[i];

                    if (tableExpression is LeftOuterJoinExpression joinExpressionBase)
                    {
                        _tables.Clear();
                        _columns.Clear();
                        _canEliminate = true;

                        Visit(joinExpressionBase.Predicate);

                        if (_canEliminate &&
                            _columns.Count > 0 &&
                            _columns.Count % 2 == 0 &&
                            _tables.Count == 2 &&
                            _tables[0].DatabaseName == _tables[1].DatabaseName &&
                            _tables[0].Table == _tables[1].Table &&
                            _tables[0].Schema == _tables[1].Schema)
                        {
                            for (var j = 0; j < _columns.Count - 1; j += 2)
                            {
                                if (_columns[j].Name != _columns[j + 1].Name)
                                {
                                    _canEliminate = false;

                                    break;
                                }
                            }

                            if (_canEliminate)
                            {
                                var newTableExpression
                                    = _tables.Single(t => !ReferenceEquals(t, joinExpressionBase.TableExpression));

                                selectExpression.RemoveTable(joinExpressionBase);
                                if (ReferenceEquals(selectExpression.ProjectStarTable, joinExpressionBase))
                                {
                                    selectExpression.ProjectStarTable
                                        = selectExpression.GetTableForQuerySource(newTableExpression.QuerySource);
                                }

                                //  selectExpression.UpdateTableReference(joinExpressionBase.TableExpression, newTableExpression);
                            }
                        }
                    }
                }
            }