示例#1
0
            private void FlattenGroupBy(IList <SqlExpression> exprs)
            {
                List <SqlExpression> list = new List <SqlExpression>(exprs.Count);

                foreach (SqlExpression expression in exprs)
                {
                    if (TypeSystem.IsSequenceType(expression.ClrType))
                    {
                        throw Error.InvalidGroupByExpressionType(expression.ClrType.Name);
                    }
                    this.FlattenGroupByExpression(list, expression);
                }
                exprs.Clear();
                //exprs.AddRange(list);
                foreach (var expression in list)
                {
                    exprs.Add(expression);
                }
            }
示例#2
0
        private static Type GetClrType(SqlNode node)
        {
            SqlTableValuedFunctionCall call = node as SqlTableValuedFunctionCall;

            if (call != null)
            {
                return(call.RowType.Type);
            }
            SqlExpression expression = node as SqlExpression;

            if (expression != null)
            {
                if (TypeSystem.IsSequenceType(expression.ClrType))
                {
                    return(TypeSystem.GetElementType(expression.ClrType));
                }
                return(expression.ClrType);
            }
            SqlSelect select = node as SqlSelect;

            if (select != null)
            {
                return(select.Selection.ClrType);
            }
            SqlTable table = node as SqlTable;

            if (table != null)
            {
                return(table.RowType.Type);
            }
            SqlUnion union = node as SqlUnion;

            if (union == null)
            {
                throw Error.UnexpectedNode(node.NodeType);
            }
            return(union.GetClrType());
        }
示例#3
0
            public override Expression VisitMemberAccess(MemberExpression m)
            {
                if (MetaPosition.AreSameMember(m.Member, this.association.ThisMember.Member))
                {
                    Expression[] keyValues = GetKeyValues(this.Visit(m.Expression), this.association.ThisKey);
                    return(Translator.WhereClauseFromSourceAndKeys(this.otherSouce, this.association.OtherKey.ToArray <MetaDataMember>(), keyValues));
                }
                Expression expression = this.Visit(m.Expression);

                if (expression == m.Expression)
                {
                    return(m);
                }
                if (((expression.Type != m.Expression.Type) && (m.Member.Name == "Count")) && TypeSystem.IsSequenceType(expression.Type))
                {
                    return(Expression.Call(typeof(Enumerable), "Count", new Type[] { TypeSystem.GetElementType(expression.Type) }, new Expression[] { expression }));
                }
                return(Expression.MakeMemberAccess(expression, m.Member));
            }