Ejemplo n.º 1
0
            internal override SqlExpression VisitMultiset(SqlSubSelect sms)
            {
                // allow one big-join per query?
                if ((this.options & Options.EnableBigJoin) != 0 &&
                    !this.hasBigJoin && this.canJoin && this.isTopLevel && this.outerSelect != null &&
                    !MultisetChecker.HasMultiset(sms.Select.Selection) &&
                    BigJoinChecker.CanBigJoin(sms.Select))
                {
                    sms.Select = this.VisitSelect(sms.Select);

                    SqlAlias alias = new SqlAlias(sms.Select);
                    SqlJoin  join  = new SqlJoin(SqlJoinType.OuterApply, this.outerSelect.From, alias, null, sms.SourceExpression);
                    this.outerSelect.From         = join;
                    this.outerSelect.OrderingType = SqlOrderingType.Always;

                    // make joined expression
                    SqlExpression expr = (SqlExpression)SqlDuplicator.Copy(sms.Select.Selection);

                    // make count expression
                    SqlSelect copySelect  = (SqlSelect)SqlDuplicator.Copy(sms.Select);
                    SqlAlias  copyAlias   = new SqlAlias(copySelect);
                    SqlSelect countSelect = new SqlSelect(sql.Unary(SqlNodeType.Count, null, sms.SourceExpression), copyAlias, sms.SourceExpression);
                    countSelect.OrderingType = SqlOrderingType.Never;
                    SqlExpression count = sql.SubSelect(SqlNodeType.ScalarSubSelect, countSelect);

                    // make joined collection
                    SqlJoinedCollection jc = new SqlJoinedCollection(sms.ClrType, sms.SqlType, expr, count, sms.SourceExpression);
                    this.hasBigJoin = true;
                    return(jc);
                }
                else
                {
                    return(QueryExtractor.Extract(sms, this.parentParameters));
                }
            }
Ejemplo n.º 2
0
        private List <SqlExpression> GetIdentityExpressions(MetaType type, SqlExpression expr)
        {
            var list  = GetIdentityMembers(type).ToList();
            var list2 = new List <SqlExpression>(list.Count);

            foreach (var item in list)
            {
                list2.Add(sql.Member((SqlExpression)SqlDuplicator.Copy(expr), item));
            }
            return(list2);
        }
Ejemplo n.º 3
0
        private List <SqlExpression> GetIdentityExpressions(MetaType type, SqlExpression expr)
        {
            List <MetaDataMember> members = GetIdentityMembers(type).ToList();

            System.Diagnostics.Debug.Assert(members.Count > 0);
            List <SqlExpression> exprs = new List <SqlExpression>(members.Count);

            foreach (MetaDataMember mm in members)
            {
                exprs.Add(sql.Member((SqlExpression)SqlDuplicator.Copy(expr), mm));
            }
            return(exprs);
        }
Ejemplo n.º 4
0
        private SqlExpression TranslateEqualsOp(SqlNodeType op, SqlExpression left, SqlExpression right, bool allowExpand)
        {
            switch (op)
            {
            case SqlNodeType.EQ:
            case SqlNodeType.NE:
                return(sql.Binary(op, left, right));

            case SqlNodeType.EQ2V:
                if (SqlExpressionNullability.CanBeNull(left) != false &&
                    SqlExpressionNullability.CanBeNull(right) != false)
                {
                    SqlNodeType eqOp = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                    return
                        (sql.Binary(SqlNodeType.Or,
                                    sql.Binary(SqlNodeType.And,
                                               sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(left)),
                                               sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(right))
                                               ),
                                    sql.Binary(SqlNodeType.And,
                                               sql.Binary(SqlNodeType.And,
                                                          sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(left)),
                                                          sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(right))
                                                          ),
                                               sql.Binary(eqOp, left, right)
                                               )
                                    ));
                }
                else
                {
                    SqlNodeType eqOp = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                    return(sql.Binary(eqOp, left, right));
                }

            case SqlNodeType.NE2V:
                if (SqlExpressionNullability.CanBeNull(left) != false &&
                    SqlExpressionNullability.CanBeNull(right) != false)
                {
                    SqlNodeType eqOp = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                    return
                        (sql.Unary(SqlNodeType.Not,
                                   sql.Binary(SqlNodeType.Or,
                                              sql.Binary(SqlNodeType.And,
                                                         sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(left)),
                                                         sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(right))
                                                         ),
                                              sql.Binary(SqlNodeType.And,
                                                         sql.Binary(SqlNodeType.And,
                                                                    sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(left)),
                                                                    sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(right))
                                                                    ),
                                                         sql.Binary(eqOp, left, right)
                                                         )
                                              )
                                   ));
                }
                else
                {
                    SqlNodeType neOp = allowExpand ? SqlNodeType.NE2V : SqlNodeType.NE;
                    return(sql.Binary(neOp, left, right));
                }

            default:
                throw Error.UnexpectedNode(op);
            }
        }