Skip to content

Commit 9bdc919

Browse files
committed
CSHARP-4339: Added database.AsQueryable().
1 parent b836109 commit 9bdc919

21 files changed

+133
-53
lines changed

src/MongoDB.Driver/IMongoDatabaseExtensions.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using MongoDB.Bson;
1919
using MongoDB.Driver.Core.Misc;
2020
using MongoDB.Driver.Core.Operations;
21+
using MongoDB.Driver.Linq;
2122

2223
namespace MongoDB.Driver
2324
{
@@ -56,6 +57,34 @@ public static IAggregateFluent<NoPipelineInput> Aggregate(this IMongoDatabase da
5657
return new DatabaseAggregateFluent<NoPipelineInput>(session, database, emptyPipeline, options ?? new AggregateOptions());
5758
}
5859

60+
/// <summary>
61+
/// Creates a queryable source of documents.
62+
/// </summary>
63+
/// <param name="database">The database.</param>
64+
/// <param name="aggregateOptions">The aggregate options</param>
65+
/// <returns>A queryable source of documents.</returns>
66+
public static IMongoQueryable<NoPipelineInput> AsQueryable(this IMongoDatabase database, AggregateOptions aggregateOptions = null)
67+
{
68+
Ensure.IsNotNull(database, nameof(database));
69+
70+
return AsQueryableHelper(database, session: null, aggregateOptions);
71+
}
72+
73+
/// <summary>
74+
/// Creates a queryable source of documents.
75+
/// </summary>
76+
/// <param name="database">The collection.</param>
77+
/// <param name="session">The session.</param>
78+
/// <param name="aggregateOptions">The aggregate options</param>
79+
/// <returns>A queryable source of documents.</returns>
80+
public static IMongoQueryable<NoPipelineInput> AsQueryable(this IMongoDatabase database, IClientSessionHandle session, AggregateOptions aggregateOptions = null)
81+
{
82+
Ensure.IsNotNull(database, nameof(database));
83+
Ensure.IsNotNull(session, nameof(session));
84+
85+
return AsQueryableHelper(database, session, aggregateOptions);
86+
}
87+
5988
/// <summary>
6089
/// Watches changes on all collection in a database.
6190
/// </summary>
@@ -137,5 +166,13 @@ public static Task<IChangeStreamCursor<ChangeStreamDocument<BsonDocument>>> Watc
137166
var emptyPipeline = new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>();
138167
return database.WatchAsync(session, emptyPipeline, options, cancellationToken);
139168
}
169+
170+
// private static methods
171+
private static IMongoQueryable<NoPipelineInput> AsQueryableHelper(IMongoDatabase database, IClientSessionHandle session, AggregateOptions aggregateOptions)
172+
{
173+
var linqProvider = database.Client.Settings.LinqProvider;
174+
aggregateOptions = aggregateOptions ?? new AggregateOptions();
175+
return linqProvider.GetAdapter().AsQueryable(database, session, aggregateOptions);
176+
}
140177
}
141178
}

src/MongoDB.Driver/Linq/Linq2Implementation/LinqProviderAdapterV2.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ internal override IMongoQueryable<TDocument> AsQueryable<TDocument>(
3636
return new MongoQueryableImpl<TDocument, TDocument>(provider);
3737
}
3838

39+
internal override IMongoQueryable<NoPipelineInput> AsQueryable(
40+
IMongoDatabase database,
41+
IClientSessionHandle session,
42+
AggregateOptions options)
43+
{
44+
throw new InvalidOperationException("LINQ2 does not support AsQueryable against a database.");
45+
}
46+
3947
public override string ToString() => "V2";
4048

4149
internal override BsonValue TranslateExpressionToAggregateExpression<TSource, TResult>(

src/MongoDB.Driver/Linq/Linq3Implementation/LinqProviderAdapterV3.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
using System;
17+
using System.Collections.ObjectModel;
1718
using System.Linq;
1819
using System.Linq.Expressions;
1920
using MongoDB.Bson;
@@ -38,6 +39,15 @@ internal override IMongoQueryable<TDocument> AsQueryable<TDocument>(
3839
return new MongoQuery<TDocument, TDocument>(provider);
3940
}
4041

42+
internal override IMongoQueryable<NoPipelineInput> AsQueryable(
43+
IMongoDatabase database,
44+
IClientSessionHandle session,
45+
AggregateOptions options)
46+
{
47+
var provider = new MongoQueryProvider<NoPipelineInput>(database, session, options);
48+
return new MongoQuery<NoPipelineInput, NoPipelineInput>(provider);
49+
}
50+
4151
public override string ToString() => "V3";
4252

4353
internal override BsonValue TranslateExpressionToAggregateExpression<TSource, TResult>(

src/MongoDB.Driver/Linq/Linq3Implementation/MongoQueryProvider.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ internal sealed class MongoQueryProvider<TDocument> : MongoQueryProvider
6060
{
6161
// private fields
6262
private readonly IMongoCollection<TDocument> _collection;
63+
private readonly IMongoDatabase _database;
6364
private ExecutableQuery<TDocument> _mostRecentExecutableQuery;
6465

6566
// constructors
@@ -72,10 +73,20 @@ public MongoQueryProvider(
7273
_collection = collection;
7374
}
7475

76+
public MongoQueryProvider(
77+
IMongoDatabase database,
78+
IClientSessionHandle session,
79+
AggregateOptions options)
80+
: base(session, options)
81+
{
82+
_database = database;
83+
}
84+
7585
// public properties
7686
public IMongoCollection<TDocument> Collection => _collection;
7787
public override CollectionNamespace CollectionNamespace => _collection.CollectionNamespace;
7888
public override IBsonSerializer CollectionDocumentSerializer => _collection.DocumentSerializer;
89+
public IMongoDatabase Database => _database;
7990

8091
// public methods
8192
public override IQueryable CreateQuery(Expression expression)

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/AllMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ public static ExecutableQuery<TDocument, bool> Translate<TDocument>(MongoQueryPr
6060
AstProject.Set("_v", BsonNull.Value)));
6161

6262
return ExecutableQuery.Create(
63-
provider.Collection,
64-
provider.Options,
63+
provider,
6564
pipeline,
6665
__finalizer);
6766
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/AnyMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ public static ExecutableQuery<TDocument, bool> Translate<TDocument>(MongoQueryPr
8686
AstProject.Set("_v", BsonNull.Value)));
8787

8888
return ExecutableQuery.Create(
89-
provider.Collection,
90-
provider.Options,
89+
provider,
9190
pipeline,
9291
__finalizer);
9392
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/AverageMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,7 @@ public static ExecutableQuery<TDocument, TOutput> Translate<TDocument>(MongoQuer
156156
AstStage.Project(AstProject.ExcludeId()));
157157

158158
return ExecutableQuery.Create(
159-
provider.Collection,
160-
provider.Options,
159+
provider,
161160
pipeline,
162161
__finalizer);
163162
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/ContainsMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ public static ExecutableQuery<TDocument, bool> Translate<TDocument>(MongoQueryPr
7979
AstProject.Set("_v", BsonNull.Value)));
8080

8181
return ExecutableQuery.Create(
82-
provider.Collection,
83-
provider.Options,
82+
provider,
8483
pipeline,
8584
__finalizer);
8685
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/CountMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ public static ExecutableQuery<TDocument, int> Translate<TDocument>(MongoQueryPro
7979
AstStage.Count("_v"));
8080

8181
return ExecutableQuery.Create(
82-
provider.Collection,
83-
provider.Options,
82+
provider,
8483
pipeline,
8584
_finalizer);
8685
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToExecutableQueryTranslators/ElementAtMethodToExecutableQueryTranslator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ public static ExecutableQuery<TDocument, TOutput> Translate<TDocument>(MongoQuer
4848
AstStage.Limit(1));
4949

5050
return ExecutableQuery.Create(
51-
provider.Collection,
52-
provider.Options,
51+
provider,
5352
pipeline,
5453
__finalizer);
5554
}

0 commit comments

Comments
 (0)