Skip to content

Commit 2ce7508

Browse files
committed
CSHARP-5473: Change Translate method to have an Expression parameter instead of an IQueryable.
1 parent 8ea23ac commit 2ce7508

File tree

3 files changed

+9
-29
lines changed

3 files changed

+9
-29
lines changed

src/MongoDB.Driver/Linq/IMongoQueryProvider.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ public interface IMongoQueryProvider : IQueryProvider
4242
Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken = default(CancellationToken));
4343

4444
/// <summary>
45-
/// Translates an IQueryable to MQL.
45+
/// Translates an Expression to MQL.
4646
/// </summary>
47-
/// <param name="queryable">The IQueryable.</param>
47+
/// <param name="expression">The expression.</param>
4848
/// <param name="outputSerializer">The output serializer.</param>
4949
/// <typeparam name="TResult">The type of the result.</typeparam>
5050
/// <returns>An array of MQL pipeline stages represented as BsonDocuments.</returns>
51-
BsonDocument[] Translate<TResult>(IQueryable<TResult> queryable, out IBsonSerializer<TResult> outputSerializer);
51+
BsonDocument[] Translate<TResult>(Expression expression, out IBsonSerializer<TResult> outputSerializer);
5252
}
5353

5454
/// <summary>

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ protected MongoQueryProvider(
5555
public abstract TResult Execute<TResult>(Expression expression);
5656
public abstract Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken);
5757
public abstract ExpressionTranslationOptions GetTranslationOptions();
58-
public abstract BsonDocument[] Translate<TResult>(IQueryable<TResult> queryable, out IBsonSerializer<TResult> outputSerializer);
58+
public abstract BsonDocument[] Translate<TResult>(Expression expression, out IBsonSerializer<TResult> outputSerializer);
5959
}
6060

6161
internal sealed class MongoQueryProvider<TDocument> : MongoQueryProvider
@@ -154,10 +154,10 @@ public override ExpressionTranslationOptions GetTranslationOptions()
154154
return translationOptions.AddMissingOptionsFrom(database?.Client.Settings.TranslationOptions);
155155
}
156156

157-
public override BsonDocument[] Translate<TResult>(IQueryable<TResult> queryable, out IBsonSerializer<TResult> outputSerializer)
157+
public override BsonDocument[] Translate<TResult>(Expression expression, out IBsonSerializer<TResult> outputSerializer)
158158
{
159159
var translationOptions = GetTranslationOptions();
160-
var executableQuery = ExpressionToExecutableQueryTranslator.Translate<TDocument, TResult>(provider: this, queryable.Expression, translationOptions);
160+
var executableQuery = ExpressionToExecutableQueryTranslator.Translate<TDocument, TResult>(provider: this, expression, translationOptions);
161161
var stages = executableQuery.Pipeline.Ast.Stages;
162162
outputSerializer = (IBsonSerializer<TResult>)executableQuery.Pipeline.OutputSerializer;
163163
return stages.Select(s => s.Render().AsBsonDocument).ToArray();

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Jira/CSharp5473Tests.cs

+3-23
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,16 @@ namespace MongoDB.Driver.Tests.Linq.Linq3Implementation.Jira
2222
{
2323
public class CSharp5473Tests : Linq3IntegrationTest
2424
{
25-
[Fact]
26-
public void Translate_queryable_should_work()
27-
{
28-
var collection = GetCollection();
29-
var queryable = collection.AsQueryable()
30-
.Select(x => x.X + 1);
31-
var provider = (IMongoQueryProvider)queryable.Provider;
32-
33-
var stages = provider.Translate(queryable, out var outputSerializer);
34-
AssertStages(stages, "{ $project : { _v : { $add : ['$X', 1] }, _id : 0 } }");
35-
36-
var pipeline = new BsonDocumentStagePipelineDefinition<C, int>(stages, outputSerializer);
37-
var result = collection.Aggregate(pipeline).Single();
38-
result.Should().Be(2);
39-
}
40-
4125
[Fact]
4226
public void Translate_expression_should_work()
4327
{
4428
var collection = GetCollection();
4529
var queryable = collection.AsQueryable()
4630
.Select(x => x.X + 1);
47-
var expression = queryable.Expression; // collection was just used as an easy way to create the Expression
31+
var expression = queryable.Expression; // queryable was just used as an easy way to create the expression and the provider
32+
var provider = (IMongoQueryProvider)queryable.Provider;
4833

49-
// this is an example of how to translate an Expression using a dummyQueryable
50-
var client = DriverTestConfiguration.Client;
51-
var dummyDatabase = client.GetDatabase("dummy");
52-
var dummyQueryable = dummyDatabase.AsQueryable().Provider.CreateQuery<C>(expression);
53-
var provider = (IMongoQueryProvider)dummyQueryable.Provider;
54-
var stages = provider.Translate(queryable, out var outputSerializer);
34+
var stages = provider.Translate<int>(expression, out var outputSerializer);
5535
AssertStages(stages, "{ $project : { _v : { $add : ['$X', 1] }, _id : 0 } }");
5636

5737
var pipeline = new BsonDocumentStagePipelineDefinition<C, int>(stages, outputSerializer);

0 commit comments

Comments
 (0)