From 0723354bba1d340a83861520bfe11715fcde8d8f Mon Sep 17 00:00:00 2001 From: Craig Wilson Date: Fri, 30 Apr 2010 11:40:55 -0500 Subject: [PATCH] minor refactoring. --- .../AggregateSubqueryExpression.cs | 6 +- source/MongoDB/Linq/Expressions/Alias.cs | 2 +- .../Linq/Expressions/AliasedExpression.cs | 23 ++++++++ .../Linq/Expressions/CollectionExpression.cs | 13 +---- .../Linq/Expressions/FieldExpression.cs | 6 +- .../Expressions/MongoExpressionVisitor.cs | 2 +- .../Linq/Expressions/ProjectionExpression.cs | 2 +- .../Linq/Expressions/SelectExpression.cs | 21 +++---- .../Linq/Translators/AggregateRewriter.cs | 4 +- .../Linq/Translators/AliasesProduced.cs | 6 +- .../MongoDB/Linq/Translators/FieldBinder.cs | 4 +- .../MongoDB/Linq/Translators/FieldMapper.cs | 12 ++-- .../Linq/Translators/FieldProjector.cs | 8 +-- .../Linq/Translators/OrderByRewriter.cs | 4 +- .../MongoDB/Linq/Translators/QueryBinder.cs | 56 +++++++++---------- .../Linq/Translators/QueryDuplicator.cs | 14 ++--- .../Translators/RedundantSubqueryRemover.cs | 2 +- source/MongoDB/MongoDB.csproj | 1 + 18 files changed, 98 insertions(+), 88 deletions(-) create mode 100644 source/MongoDB/Linq/Expressions/AliasedExpression.cs diff --git a/source/MongoDB/Linq/Expressions/AggregateSubqueryExpression.cs b/source/MongoDB/Linq/Expressions/AggregateSubqueryExpression.cs index 6084f4d7..dc74cd9e 100644 --- a/source/MongoDB/Linq/Expressions/AggregateSubqueryExpression.cs +++ b/source/MongoDB/Linq/Expressions/AggregateSubqueryExpression.cs @@ -10,7 +10,7 @@ internal class AggregateSubqueryExpression : MongoExpression { private Expression _aggregateInGroupSelect; private ScalarExpression _aggregateAsSubquery; - private string _groupByAlias; + private Alias _groupByAlias; public Expression AggregateInGroupSelect { @@ -22,12 +22,12 @@ public ScalarExpression AggregateAsSubquery get { return _aggregateAsSubquery; } } - public string GroupByAlias + public Alias GroupByAlias { get { return _groupByAlias; } } - public AggregateSubqueryExpression(string groupByAlias, Expression aggregateInGroupSelect, ScalarExpression aggregateAsSubquery) + public AggregateSubqueryExpression(Alias groupByAlias, Expression aggregateInGroupSelect, ScalarExpression aggregateAsSubquery) : base(MongoExpressionType.AggregateSubquery, aggregateAsSubquery.Type) { _groupByAlias = groupByAlias; diff --git a/source/MongoDB/Linq/Expressions/Alias.cs b/source/MongoDB/Linq/Expressions/Alias.cs index abc2c30c..283ce7ac 100644 --- a/source/MongoDB/Linq/Expressions/Alias.cs +++ b/source/MongoDB/Linq/Expressions/Alias.cs @@ -5,6 +5,6 @@ namespace MongoDB.Linq.Expressions { - public class Alias + internal sealed class Alias { } } \ No newline at end of file diff --git a/source/MongoDB/Linq/Expressions/AliasedExpression.cs b/source/MongoDB/Linq/Expressions/AliasedExpression.cs new file mode 100644 index 00000000..388e16ed --- /dev/null +++ b/source/MongoDB/Linq/Expressions/AliasedExpression.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MongoDB.Linq.Expressions +{ + internal abstract class AliasedExpression : MongoExpression + { + private Alias _alias; + + public Alias Alias + { + get { return _alias; } + } + + protected AliasedExpression(MongoExpressionType nodeType, Type type, Alias alias) + : base(nodeType, type) + { + _alias = alias; + } + } +} diff --git a/source/MongoDB/Linq/Expressions/CollectionExpression.cs b/source/MongoDB/Linq/Expressions/CollectionExpression.cs index a6fbeb05..e0ea7df5 100644 --- a/source/MongoDB/Linq/Expressions/CollectionExpression.cs +++ b/source/MongoDB/Linq/Expressions/CollectionExpression.cs @@ -6,18 +6,12 @@ namespace MongoDB.Linq.Expressions { - internal class CollectionExpression : MongoExpression + internal class CollectionExpression : AliasedExpression { - private readonly string _alias; private readonly string _collectionName; private readonly IMongoDatabase _database; private readonly Type _documentType; - public string Alias - { - get { return _alias; } - } - public string CollectionName { get { return _collectionName; } @@ -33,10 +27,9 @@ public Type DocumentType get { return _documentType; } } - public CollectionExpression(Type type, string alias, IMongoDatabase database, string collectionName, Type documentType) - : base(MongoExpressionType.Collection, type) + public CollectionExpression(Alias alias, IMongoDatabase database, string collectionName, Type documentType) + : base(MongoExpressionType.Collection, typeof(void), alias) { - _alias = alias; _collectionName = collectionName; _database = database; _documentType = documentType; diff --git a/source/MongoDB/Linq/Expressions/FieldExpression.cs b/source/MongoDB/Linq/Expressions/FieldExpression.cs index 5616046f..b4ec54b4 100644 --- a/source/MongoDB/Linq/Expressions/FieldExpression.cs +++ b/source/MongoDB/Linq/Expressions/FieldExpression.cs @@ -8,11 +8,11 @@ namespace MongoDB.Linq.Expressions { internal class FieldExpression : MongoExpression { - private readonly string _alias; + private readonly Alias _alias; private readonly Expression _expression; private readonly string _name; - public string Alias + public Alias Alias { get { return _alias; } } @@ -27,7 +27,7 @@ public string Name get { return _name; } } - public FieldExpression(Expression expression, string alias, string name) + public FieldExpression(Expression expression, Alias alias, string name) : base(MongoExpressionType.Field, expression.Type) { _alias = alias; diff --git a/source/MongoDB/Linq/Expressions/MongoExpressionVisitor.cs b/source/MongoDB/Linq/Expressions/MongoExpressionVisitor.cs index b0199918..939f83ab 100644 --- a/source/MongoDB/Linq/Expressions/MongoExpressionVisitor.cs +++ b/source/MongoDB/Linq/Expressions/MongoExpressionVisitor.cs @@ -76,7 +76,7 @@ protected virtual Expression VisitSelect(SelectExpression select) var take = Visit(select.Take); var fields = VisitFieldDeclarationList(select.Fields); if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields) - return new SelectExpression(select.Type, select.Alias, fields, from, where, orderBy, groupBy, select.Distinct, skip, take); + return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.Distinct, skip, take); return select; } diff --git a/source/MongoDB/Linq/Expressions/ProjectionExpression.cs b/source/MongoDB/Linq/Expressions/ProjectionExpression.cs index b3df0eb2..359ed472 100644 --- a/source/MongoDB/Linq/Expressions/ProjectionExpression.cs +++ b/source/MongoDB/Linq/Expressions/ProjectionExpression.cs @@ -32,7 +32,7 @@ public ProjectionExpression(SelectExpression source, Expression projector) { } public ProjectionExpression(SelectExpression source, Expression projector, LambdaExpression aggregator) - : base(MongoExpressionType.Projection, source.Type) + : base(MongoExpressionType.Projection, aggregator != null ? aggregator.Body.Type : typeof(IEnumerable<>).MakeGenericType(projector.Type)) { _source = source; _projector = projector; diff --git a/source/MongoDB/Linq/Expressions/SelectExpression.cs b/source/MongoDB/Linq/Expressions/SelectExpression.cs index c7644b9e..2d00b66a 100644 --- a/source/MongoDB/Linq/Expressions/SelectExpression.cs +++ b/source/MongoDB/Linq/Expressions/SelectExpression.cs @@ -7,9 +7,8 @@ namespace MongoDB.Linq.Expressions { - internal class SelectExpression : MongoExpression + internal class SelectExpression : AliasedExpression { - private readonly string _alias; private readonly bool _distinct; private readonly ReadOnlyCollection _fields; private readonly Expression _from; @@ -19,11 +18,6 @@ internal class SelectExpression : MongoExpression private readonly Expression _skip; private readonly Expression _where; - public string Alias - { - get { return _alias; } - } - public bool Distinct { get { return _distinct; } @@ -64,12 +58,16 @@ public Expression Where get { return _where; } } - public SelectExpression(Type type, string alias, IEnumerable fields, Expression from, Expression where) - : this(type, alias, fields, from, where, null, null, false, null, null) + public SelectExpression(Alias alias, IEnumerable fields, Expression from, Expression where) + : this(alias, fields, from, where, null, null) + { } + + public SelectExpression(Alias alias, IEnumerable fields, Expression from, Expression where, IEnumerable orderBy, Expression groupBy) + : this(alias, fields, from, where, orderBy, groupBy, false, null, null) { } - public SelectExpression(Type type, string alias, IEnumerable fields, Expression from, Expression where, IEnumerable orderBy, Expression groupBy, bool distinct, Expression skip, Expression take) - : base(MongoExpressionType.Select, type) + public SelectExpression(Alias alias, IEnumerable fields, Expression from, Expression where, IEnumerable orderBy, Expression groupBy, bool distinct, Expression skip, Expression take) + : base(MongoExpressionType.Select, typeof(void), alias) { _fields = fields as ReadOnlyCollection; if (_fields == null) @@ -79,7 +77,6 @@ public SelectExpression(Type type, string alias, IEnumerable f if (_orderBy == null && orderBy != null) _orderBy = new List(orderBy).AsReadOnly(); - _alias = alias; _distinct = distinct; _from = from; _groupBy = groupBy; diff --git a/source/MongoDB/Linq/Translators/AggregateRewriter.cs b/source/MongoDB/Linq/Translators/AggregateRewriter.cs index 990e9967..4515d8a4 100644 --- a/source/MongoDB/Linq/Translators/AggregateRewriter.cs +++ b/source/MongoDB/Linq/Translators/AggregateRewriter.cs @@ -9,7 +9,7 @@ namespace MongoDB.Linq.Translators { internal class AggregateRewriter : MongoExpressionVisitor { - ILookup _lookup; + ILookup _lookup; Dictionary _map; public AggregateRewriter() @@ -47,7 +47,7 @@ protected override Expression VisitSelect(SelectExpression select) _map.Add(ae, new FieldExpression(ae.AggregateInGroupSelect, ae.GroupByAlias, name)); fields.Add(field); } - return new SelectExpression(select.Type, select.Alias, fields, select.From, select.Where, select.OrderBy, select.GroupBy, select.Distinct, select.Skip, select.Take); + return new SelectExpression(select.Alias, fields, select.From, select.Where, select.OrderBy, select.GroupBy, select.Distinct, select.Skip, select.Take); } return select; } diff --git a/source/MongoDB/Linq/Translators/AliasesProduced.cs b/source/MongoDB/Linq/Translators/AliasesProduced.cs index 68c71512..63ac358c 100644 --- a/source/MongoDB/Linq/Translators/AliasesProduced.cs +++ b/source/MongoDB/Linq/Translators/AliasesProduced.cs @@ -13,11 +13,11 @@ namespace MongoDB.Linq.Translators /// internal class AliasesProduced : MongoExpressionVisitor { - private HashSet _aliases; + private HashSet _aliases; - public HashSet Gather(Expression source) + public HashSet Gather(Expression source) { - _aliases = new HashSet(); + _aliases = new HashSet(); Visit(source); return _aliases; } diff --git a/source/MongoDB/Linq/Translators/FieldBinder.cs b/source/MongoDB/Linq/Translators/FieldBinder.cs index e1e1fa52..53e9f957 100644 --- a/source/MongoDB/Linq/Translators/FieldBinder.cs +++ b/source/MongoDB/Linq/Translators/FieldBinder.cs @@ -15,10 +15,12 @@ internal class FieldBinder : ExpressionVisitor typeof(ICollection), typeof(ICollection<>) }; + private Alias _alias; private FieldFinder _finder; public Expression Bind(Expression expression) { + _alias = new Alias(); _finder = new FieldFinder(); return Visit(expression); } @@ -30,7 +32,7 @@ protected override Expression Visit(Expression exp) var fieldName = _finder.Find(exp); if (fieldName != null) - return new FieldExpression(exp, string.Empty, fieldName); + return new FieldExpression(exp, _alias, fieldName); return base.Visit(exp); } diff --git a/source/MongoDB/Linq/Translators/FieldMapper.cs b/source/MongoDB/Linq/Translators/FieldMapper.cs index da3d725e..427fa845 100644 --- a/source/MongoDB/Linq/Translators/FieldMapper.cs +++ b/source/MongoDB/Linq/Translators/FieldMapper.cs @@ -10,19 +10,19 @@ namespace MongoDB.Linq.Translators { internal class FieldMapper : MongoExpressionVisitor { - private HashSet _oldAliases; - private string _newAlias; + private HashSet _oldAliases; + private Alias _newAlias; - public Expression Map(Expression expression, string newAlias, IEnumerable oldAliases) + public Expression Map(Expression expression, Alias newAlias, IEnumerable oldAliases) { - _oldAliases = new HashSet(oldAliases); + _oldAliases = new HashSet(oldAliases); _newAlias = newAlias; return Visit(expression); } - public Expression Map(Expression expression, string newAlias, params string[] oldAliases) + public Expression Map(Expression expression, Alias newAlias, params Alias[] oldAliases) { - return Map(expression, newAlias, (IEnumerable)oldAliases); + return Map(expression, newAlias, (IEnumerable)oldAliases); } protected override Expression VisitField(FieldExpression field) diff --git a/source/MongoDB/Linq/Translators/FieldProjector.cs b/source/MongoDB/Linq/Translators/FieldProjector.cs index adf63edc..6886b6f5 100644 --- a/source/MongoDB/Linq/Translators/FieldProjector.cs +++ b/source/MongoDB/Linq/Translators/FieldProjector.cs @@ -13,11 +13,11 @@ namespace MongoDB.Linq.Translators internal class FieldProjector : MongoExpressionVisitor { private HashSet _candidates; - private string[] _existingAliases; + private Alias[] _existingAliases; private HashSet _fieldNames; private List _fields; private Dictionary _map; - private string _newAlias; + private Alias _newAlias; private Nominator _nominator; private int columnIndex; @@ -26,7 +26,7 @@ public FieldProjector(Func canBeField) _nominator = new Nominator(canBeField); } - public FieldProjection ProjectFields(Expression expression, string newAlias, params string[] existingAliases) + public FieldProjection ProjectFields(Expression expression, Alias newAlias, params Alias[] existingAliases) { _newAlias = newAlias; _existingAliases = existingAliases; @@ -48,7 +48,7 @@ protected override Expression Visit(Expression exp) if (_map.TryGetValue(field, out mapped)) return mapped; - string alias = _existingAliases.Contains(field.Alias) ? field.Alias : _newAlias; + Alias alias = _existingAliases.Contains(field.Alias) ? field.Alias : _newAlias; var ordinal = _fields.Count; var fieldName = GetUniqueFieldName(field.Name); _fields.Add(new FieldDeclaration(fieldName, field)); diff --git a/source/MongoDB/Linq/Translators/OrderByRewriter.cs b/source/MongoDB/Linq/Translators/OrderByRewriter.cs index 8d417404..4cb6b51a 100644 --- a/source/MongoDB/Linq/Translators/OrderByRewriter.cs +++ b/source/MongoDB/Linq/Translators/OrderByRewriter.cs @@ -60,7 +60,7 @@ protected override Expression VisitSelect(SelectExpression select) _gatheredOrderings = null; } if (orderings != select.OrderBy || fields != select.Fields) - select = new SelectExpression(select.Type, select.Alias, fields, select.From, select.Where, orderings, select.GroupBy, select.Distinct, select.Skip, select.Take); + select = new SelectExpression(select.Alias, fields, select.From, select.Where, orderings, select.GroupBy, select.Distinct, select.Skip, select.Take); return select; } @@ -107,7 +107,7 @@ private void PrependOrderings(IList newOrderings) } } - private BindResult RebindOrderings(IEnumerable orderings, string alias, HashSet existingAliases, IEnumerable existingFields) + private BindResult RebindOrderings(IEnumerable orderings, Alias alias, HashSet existingAliases, IEnumerable existingFields) { List newFields = null; var newOrderings = new List(); diff --git a/source/MongoDB/Linq/Translators/QueryBinder.cs b/source/MongoDB/Linq/Translators/QueryBinder.cs index 88d700c2..71467f76 100644 --- a/source/MongoDB/Linq/Translators/QueryBinder.cs +++ b/source/MongoDB/Linq/Translators/QueryBinder.cs @@ -12,7 +12,6 @@ namespace MongoDB.Linq.Translators internal class QueryBinder : MongoExpressionVisitor { private int _aggregateCount; - private int _aliasCount; private Expression _currentGroupElement; private Dictionary _groupByMap; private Dictionary _map; @@ -207,12 +206,12 @@ private Expression BindAggregate(Expression source, MethodInfo method, LambdaExp else if(!hasPredicateArgument) argExpression = projection.Projector; - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); Expression aggregateExpression = new AggregateExpression(returnType, aggregateType, argExpression, distinct); var selectType = typeof(IEnumerable<>).MakeGenericType(returnType); string fieldName = "_$agg" + (_aggregateCount++); - var select = new SelectExpression(selectType, alias, new[] { new FieldDeclaration(fieldName, aggregateExpression) }, projection.Source, null); + var select = new SelectExpression(alias, new[] { new FieldDeclaration(fieldName, aggregateExpression) }, projection.Source, null); if (isRoot) { @@ -252,10 +251,10 @@ private Expression BindDistinct(Expression source) { var projection = VisitSequence(source); var select = projection.Source; - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(select.Type, alias, fieldProjection.Fields, projection.Source, null, null, null, true, null, null), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, null, null, null, true, null, null), fieldProjection.Projector); } @@ -275,10 +274,10 @@ private Expression BindFirstOrSingle(Expression source, LambdaExpression predica if (take != null || where != null) { - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); projection = new ProjectionExpression( - new SelectExpression(source.Type, alias, fieldProjection.Fields, projection.Source, where, null, null, false, null, take), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, where, null, null, false, null, take), fieldProjection.Projector); } if (isRoot) @@ -318,14 +317,14 @@ protected virtual Expression BindGroupBy(Expression source, LambdaExpression key subqueryElementExpression = Visit(elementSelector.Body); } - var elementAlias = GetNextAlias(); + var elementAlias = new Alias(); var elementProjection = _projector.ProjectFields(subqueryElementExpression, elementAlias, subqueryBasis.Source.Alias); var elementSubquery = new ProjectionExpression( - new SelectExpression(TypeHelper.GetSequenceType(subqueryElementExpression.Type), elementAlias, elementProjection.Fields, subqueryBasis.Source, subqueryCorrelation), + new SelectExpression(elementAlias, elementProjection.Fields, subqueryBasis.Source, subqueryCorrelation), elementProjection.Projector); - var alias = GetNextAlias(); + var alias = new Alias(); var info = new GroupByInfo(alias, elementExpression); _groupByMap[elementSubquery] = info; @@ -354,7 +353,7 @@ protected virtual Expression BindGroupBy(Expression source, LambdaExpression key _groupByMap[projectedElementSubquery] = info; return new ProjectionExpression( - new SelectExpression(TypeHelper.GetSequenceType(resultExpression.Type), alias, new FieldDeclaration[0], projection.Source, null, null, keyExpression, false, null, null), + new SelectExpression(alias, new FieldDeclaration[0], projection.Source, null, null, keyExpression, false, null, null), fieldProjection.Projector); } @@ -378,10 +377,10 @@ private Expression BindOrderBy(Type resultType, Expression source, LambdaExpress } } - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(resultType, alias, fieldProjection.Fields, projection.Source, null, orderings.AsReadOnly(), null, false, null, null), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, null, orderings.AsReadOnly(), null, false, null, null), fieldProjection.Projector); } @@ -390,10 +389,10 @@ private Expression BindSelect(Type resultType, Expression source, LambdaExpressi var projection = VisitSequence(source); _map[selector.Parameters[0]] = projection.Projector; var expression = Visit(selector.Body); - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(expression, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(resultType, alias, fieldProjection.Fields, projection.Source, null), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, null), fieldProjection.Projector); } @@ -402,10 +401,10 @@ private Expression BindSkip(Expression source, Expression skip) var projection = VisitSequence(source); skip = Visit(skip); var select = projection.Source; - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(select.Type, alias, fieldProjection.Fields, projection.Source, null, null, null, false, skip, null), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, null, null, null, false, skip, null), fieldProjection.Projector); } @@ -414,10 +413,10 @@ private Expression BindTake(Expression source, Expression take) var projection = VisitSequence(source); take = Visit(take); var select = projection.Source; - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(select.Type, alias, fieldProjection.Fields, projection.Source, null, null, null, false, null, take), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, null, null, null, false, null, take), fieldProjection.Projector); } @@ -435,23 +434,23 @@ private Expression BindWhere(Type resultType, Expression source, LambdaExpressio var projection = VisitSequence(source); _map[predicate.Parameters[0]] = projection.Projector; var where = Visit(predicate.Body); - var alias = GetNextAlias(); + var alias = new Alias(); var fieldProjection = _projector.ProjectFields(projection.Projector, alias, projection.Source.Alias); return new ProjectionExpression( - new SelectExpression(resultType, alias, fieldProjection.Fields, projection.Source, where), + new SelectExpression(alias, fieldProjection.Fields, projection.Source, where), fieldProjection.Projector); } private ProjectionExpression GetCollectionProjection(object value) { - var collectionAlias = GetNextAlias(); - var selectAlias = GetNextAlias(); + var collectionAlias = new Alias(); + var selectAlias = new Alias(); var collection = (IMongoQueryable)value; var bindings = new List(); var fields = new List(); var resultType = typeof(IEnumerable<>).MakeGenericType(collection.ElementType); return new ProjectionExpression( - new SelectExpression(resultType, selectAlias, fields, new CollectionExpression(resultType, collectionAlias, collection.Database, collection.CollectionName, collection.ElementType), null), + new SelectExpression(selectAlias, fields, new CollectionExpression(collectionAlias, collection.Database, collection.CollectionName, collection.ElementType), null), Expression.Parameter(collection.ElementType, "document")); } @@ -529,11 +528,6 @@ private static AggregateType GetAggregateType(string methodName) throw new NotSupportedException(string.Format("Aggregate of type '{0}' is not supported.", methodName)); } - internal string GetNextAlias() - { - return "_$" + (_aliasCount++); - } - private static bool HasPredicateArgument(AggregateType aggregateType) { return aggregateType == AggregateType.Count; @@ -565,10 +559,10 @@ private static Expression StripQuotes(Expression e) private class GroupByInfo { - public string Alias { get; private set; } + public Alias Alias { get; private set; } public Expression Element { get; private set; } - public GroupByInfo(string alias, Expression element) + public GroupByInfo(Alias alias, Expression element) { Alias = alias; Element = element; diff --git a/source/MongoDB/Linq/Translators/QueryDuplicator.cs b/source/MongoDB/Linq/Translators/QueryDuplicator.cs index e2ce298e..116dbc26 100644 --- a/source/MongoDB/Linq/Translators/QueryDuplicator.cs +++ b/source/MongoDB/Linq/Translators/QueryDuplicator.cs @@ -10,32 +10,32 @@ namespace MongoDB.Linq.Translators { internal class QueryDuplicator : MongoExpressionVisitor { - Dictionary _map; + Dictionary _map; public Expression Duplicate(Expression expression) { - _map = new Dictionary(); + _map = new Dictionary(); return Visit(expression); } protected override Expression VisitCollection(CollectionExpression collection) { - var newAlias = collection.Alias + "cpy"; + var newAlias = new Alias(); _map[collection.Alias] = newAlias; - return new CollectionExpression(collection.Type, newAlias, collection.Database, collection.CollectionName, collection.DocumentType); + return new CollectionExpression(newAlias, collection.Database, collection.CollectionName, collection.DocumentType); } protected override Expression VisitSelect(SelectExpression select) { - var newAlias = select.Alias + "cpy"; + var newAlias = new Alias(); _map[select.Alias] = newAlias; select = (SelectExpression)base.VisitSelect(select); - return new SelectExpression(select.Type, newAlias, select.Fields, select.From, select.Where, select.OrderBy, select.GroupBy, select.Distinct, select.Skip, select.Take); + return new SelectExpression(newAlias, select.Fields, select.From, select.Where, select.OrderBy, select.GroupBy, select.Distinct, select.Skip, select.Take); } protected override Expression VisitField(FieldExpression field) { - string newAlias; + Alias newAlias; if (_map.TryGetValue(field.Alias, out newAlias)) return new FieldExpression(field.Expression, newAlias, field.Name); diff --git a/source/MongoDB/Linq/Translators/RedundantSubqueryRemover.cs b/source/MongoDB/Linq/Translators/RedundantSubqueryRemover.cs index f4e19364..6bed5ab5 100644 --- a/source/MongoDB/Linq/Translators/RedundantSubqueryRemover.cs +++ b/source/MongoDB/Linq/Translators/RedundantSubqueryRemover.cs @@ -56,7 +56,7 @@ protected override Expression VisitSelect(SelectExpression select) || take != select.Take || fields != select.Fields) { - select = new SelectExpression(select.Type, select.Alias, fields, select.From, where, orderBy, groupBy, distinct, skip, take); + select = new SelectExpression(select.Alias, fields, select.From, where, orderBy, groupBy, distinct, skip, take); } } diff --git a/source/MongoDB/MongoDB.csproj b/source/MongoDB/MongoDB.csproj index e4ce00a7..7c09f4d1 100644 --- a/source/MongoDB/MongoDB.csproj +++ b/source/MongoDB/MongoDB.csproj @@ -119,6 +119,7 @@ +