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); } }
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()); }
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)); }