Skip to content

Commit ecc4e6e

Browse files
committed
CSHARP-4331: Make LINQ3 the default LinqProvider.
1 parent daf2124 commit ecc4e6e

File tree

35 files changed

+92
-66
lines changed

35 files changed

+92
-66
lines changed

Docs/reference/content/reference/driver/crud/linq3.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@ title = "LINQ3"
1111

1212
## LINQ3
1313

14-
We have implemented a new LINQ provider, which is known as LINQ3. The current LINQ provider is known as LINQ2 (and LINQ1 is the now-obsolete LINQ provider in the v1.x releases of the driver).
14+
We have implemented a new LINQ provider, which is known as LINQ3. The previous LINQ provider is known as LINQ2 (and LINQ1 is the now-obsolete LINQ provider in the v1.x releases of the driver).
1515

16-
While we fully transition to the new LINQ provider the two LINQ providers will exist side by side. LINQ2 will continue to be the default LINQ provider for the time being.
16+
While we fully transition to the new LINQ provider the two LINQ providers will exist side by side. Starting with 2.19.0, LINQ3 is the default LINQ provider.
1717

18-
LINQ3 is production-ready. It fixes many LINQ2 bugs and offers support for a variety of new aggregation pipeline features present in newer server versions. We encourage all users to switch to LINQ3 and report any issues encountered. The [MongoDB Analyzer](https://www.mongodb.com/docs/mongodb-analyzer/current/) will provide tooltips indicating whether a particular query is supported in LINQ2, LINQ3, or both.
18+
LINQ3 is production-ready. It fixes many LINQ2 bugs and offers support for a variety of new aggregation pipeline features present in newer server versions. The [MongoDB Analyzer](https://www.mongodb.com/docs/mongodb-analyzer/current/) will provide tooltips indicating whether a particular query is supported in LINQ2, LINQ3, or both.
1919

20-
You can opt into the new LINQ3 provider by configuring your `MongoClient` to use the new LINQ provider as follows:
20+
If you encounter a problem with LINQ3, you can switch back the LINQ2 provider by configuring your `MongoClient` to use the previous LINQ provider as follows:
2121

2222
```csharp
2323
var connectionString = "mongodb://localhost";
2424
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
25-
clientSettings.LinqProvider = LinqProvider.V3;
25+
clientSettings.LinqProvider = LinqProvider.V2;
2626
var client = new MongoClient(clientSettings);
2727
```
2828

2929
The LINQ provider is only configurable at the `MongoClient` level. All LINQ queries run with a particular `MongoClient` use the same LINQ provider.
30+
31+
If you do encounter a query that works in LINQ2 but fails in LINQ3, please file a [CSHARP ticket](https://jira.mongodb.org/browse/CSHARP) with a self-contained reproduction of the problem so that we can investigate and fix the issue.

src/MongoDB.Driver/ChangeStreamHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
3232
MessageEncoderSettings messageEncoderSettings,
3333
bool retryRequested)
3434
{
35-
return CreateChangeStreamOperation(pipeline, LinqProvider.V2, options, readConcern, messageEncoderSettings, retryRequested);
35+
return CreateChangeStreamOperation(pipeline, LinqProvider.V3, options, readConcern, messageEncoderSettings, retryRequested);
3636
}
3737

3838
public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult>(
@@ -65,7 +65,7 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
6565
MessageEncoderSettings messageEncoderSettings,
6666
bool retryRequested)
6767
{
68-
return CreateChangeStreamOperation(database, pipeline, LinqProvider.V2, options, readConcern, messageEncoderSettings, retryRequested);
68+
return CreateChangeStreamOperation(database, pipeline, LinqProvider.V3, options, readConcern, messageEncoderSettings, retryRequested);
6969
}
7070

7171
public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult>(
@@ -101,7 +101,7 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
101101
MessageEncoderSettings messageEncoderSettings,
102102
bool retryRequested)
103103
{
104-
return CreateChangeStreamOperation(collection, pipeline, documentSerializer, LinqProvider.V2, options, readConcern, messageEncoderSettings, retryRequested);
104+
return CreateChangeStreamOperation(collection, pipeline, documentSerializer, LinqProvider.V3, options, readConcern, messageEncoderSettings, retryRequested);
105105
}
106106

107107
public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult, TDocument>(

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public abstract class FieldDefinition<TDocument>
143143
/// <returns>A <see cref="String"/>.</returns>
144144
public virtual RenderedFieldDefinition Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
145145
{
146-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
146+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
147147
}
148148

149149
/// <summary>
@@ -188,7 +188,7 @@ public abstract class FieldDefinition<TDocument, TField>
188188
/// <returns>A <see cref="RenderedFieldDefinition{TField}"/>.</returns>
189189
public virtual RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
190190
{
191-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
191+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
192192
}
193193

194194
/// <summary>
@@ -203,7 +203,7 @@ public virtual RenderedFieldDefinition<TField> Render(
203203
IBsonSerializerRegistry serializerRegistry,
204204
bool allowScalarValueForArrayField)
205205
{
206-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2, allowScalarValueForArrayField);
206+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3, allowScalarValueForArrayField);
207207
}
208208

209209
/// <summary>

src/MongoDB.Driver/FilterDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static FilterDefinition<TDocument> Empty
4646
/// <returns>A <see cref="BsonDocument"/>.</returns>
4747
public virtual BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
4848
{
49-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
49+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
5050
}
5151

5252
/// <summary>

src/MongoDB.Driver/IndexKeysDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public abstract class IndexKeysDefinition<TDocument>
3535
/// <returns>A <see cref="BsonDocument"/>.</returns>
3636
public virtual BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
3737
{
38-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
38+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
3939
}
4040

4141
/// <summary>

src/MongoDB.Driver/MongoClientSettings.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public MongoClientSettings()
110110
_heartbeatInterval = ServerSettings.DefaultHeartbeatInterval;
111111
_heartbeatTimeout = ServerSettings.DefaultHeartbeatTimeout;
112112
_ipv6 = false;
113-
_linqProvider = LinqProvider.V2;
113+
_linqProvider = LinqProvider.V3;
114114
_loadBalanced = false;
115115
_localThreshold = MongoDefaults.LocalThreshold;
116116
_maxConnecting = MongoInternalDefaults.ConnectionPool.MaxConnecting;
@@ -958,7 +958,7 @@ public static MongoClientSettings FromUrl(MongoUrl url)
958958
clientSettings.HeartbeatInterval = url.HeartbeatInterval;
959959
clientSettings.HeartbeatTimeout = url.HeartbeatTimeout;
960960
clientSettings.IPv6 = url.IPv6;
961-
clientSettings.LinqProvider = LinqProvider.V2;
961+
clientSettings.LinqProvider = LinqProvider.V3;
962962
clientSettings.LoadBalanced = url.LoadBalanced;
963963
clientSettings.LocalThreshold = url.LocalThreshold;
964964
clientSettings.MaxConnecting = url.MaxConnecting;

src/MongoDB.Driver/PipelineDefinition.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public abstract class PipelineDefinition<TInput, TOutput>
8686
/// <returns>A <see cref="RenderedPipelineDefinition{TOutput}"/></returns>
8787
public virtual RenderedPipelineDefinition<TOutput> Render(IBsonSerializer<TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
8888
{
89-
return Render(inputSerializer, serializerRegistry, LinqProvider.V2);
89+
return Render(inputSerializer, serializerRegistry, LinqProvider.V3);
9090
}
9191

9292
/// <summary>
@@ -101,7 +101,7 @@ public virtual RenderedPipelineDefinition<TOutput> Render(IBsonSerializer<TInput
101101
/// <inheritdoc/>
102102
public override string ToString()
103103
{
104-
return ToString(LinqProvider.V2);
104+
return ToString(LinqProvider.V3);
105105
}
106106

107107
/// <summary>
@@ -128,7 +128,7 @@ public string ToString(LinqProvider linqProvider)
128128
/// </returns>
129129
public string ToString(IBsonSerializer<TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
130130
{
131-
return ToString(inputSerializer, serializerRegistry, LinqProvider.V2);
131+
return ToString(inputSerializer, serializerRegistry, LinqProvider.V3);
132132
}
133133

134134
/// <summary>

src/MongoDB.Driver/PipelineStageDefinition.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public Type OutputType
188188
/// <returns>A <see cref="RenderedPipelineStageDefinition{TOutput}" /></returns>
189189
public virtual RenderedPipelineStageDefinition<TOutput> Render(IBsonSerializer<TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
190190
{
191-
return Render(inputSerializer, serializerRegistry, LinqProvider.V2);
191+
return Render(inputSerializer, serializerRegistry, LinqProvider.V3);
192192
}
193193

194194
/// <summary>
@@ -218,7 +218,7 @@ public override string ToString()
218218
/// </returns>
219219
public string ToString(IBsonSerializer<TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
220220
{
221-
return ToString(inputSerializer, serializerRegistry, LinqProvider.V2);
221+
return ToString(inputSerializer, serializerRegistry, LinqProvider.V3);
222222
}
223223

224224
/// <summary>
@@ -283,7 +283,7 @@ public static implicit operator PipelineStageDefinition<TInput, TOutput>(string
283283
/// <inheritdoc />
284284
IRenderedPipelineStageDefinition IPipelineStageDefinition.Render(IBsonSerializer inputSerializer, IBsonSerializerRegistry serializerRegistry)
285285
{
286-
return Render((IBsonSerializer<TInput>)inputSerializer, serializerRegistry, LinqProvider.V2);
286+
return Render((IBsonSerializer<TInput>)inputSerializer, serializerRegistry, LinqProvider.V3);
287287
}
288288

289289
/// <inheritdoc />

src/MongoDB.Driver/ProjectionDefinition.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public abstract class ProjectionDefinition<TSource>
7373
/// <returns>A <see cref="BsonDocument"/>.</returns>
7474
public virtual BsonDocument Render(IBsonSerializer<TSource> sourceSerializer, IBsonSerializerRegistry serializerRegistry)
7575
{
76-
return Render(sourceSerializer, serializerRegistry, LinqProvider.V2);
76+
return Render(sourceSerializer, serializerRegistry, LinqProvider.V3);
7777
}
7878

7979
/// <summary>
@@ -135,7 +135,7 @@ public abstract class ProjectionDefinition<TSource, TProjection>
135135
/// <returns>A <see cref="RenderedProjectionDefinition{TProjection}"/>.</returns>
136136
public virtual RenderedProjectionDefinition<TProjection> Render(IBsonSerializer<TSource> sourceSerializer, IBsonSerializerRegistry serializerRegistry)
137137
{
138-
return Render(sourceSerializer, serializerRegistry, LinqProvider.V2);
138+
return Render(sourceSerializer, serializerRegistry, LinqProvider.V3);
139139
}
140140

141141
/// <summary>

src/MongoDB.Driver/SortDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public abstract class SortDefinition<TDocument>
5151
/// <returns>A <see cref="BsonDocument"/>.</returns>
5252
public virtual BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
5353
{
54-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
54+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
5555
}
5656

5757
/// <summary>

src/MongoDB.Driver/UpdateDefinition.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public abstract class UpdateDefinition<TDocument>
3636
/// <returns>A <see cref="BsonValue"/>.</returns>
3737
public virtual BsonValue Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
3838
{
39-
return Render(documentSerializer, serializerRegistry, LinqProvider.V2);
39+
return Render(documentSerializer, serializerRegistry, LinqProvider.V3);
4040
}
4141

4242
/// <summary>
@@ -151,7 +151,7 @@ public override string ToString()
151151
/// </returns>
152152
public string ToString(IBsonSerializer<TDocument> inputSerializer, IBsonSerializerRegistry serializerRegistry)
153153
{
154-
return ToString(inputSerializer, serializerRegistry, LinqProvider.V2);
154+
return ToString(inputSerializer, serializerRegistry, LinqProvider.V3);
155155
}
156156

157157
/// <summary>

tests/MongoDB.Driver.TestHelpers/DriverTestConfiguration.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,24 @@ namespace MongoDB.Driver.Tests
3434
public static class DriverTestConfiguration
3535
{
3636
// private static fields
37-
private static Lazy<MongoClient> __client;
3837
private static Lazy<MongoClient> __clientWithMultipleShardRouters;
3938
private static CollectionNamespace __collectionNamespace;
4039
private static DatabaseNamespace __databaseNamespace;
4140
private static Lazy<IReadOnlyList<IMongoClient>> __directClientsToShardRouters;
41+
private static Lazy<MongoClient> __linq2Client;
4242
private static Lazy<MongoClient> __linq3Client;
4343

4444
// static constructor
4545
static DriverTestConfiguration()
4646
{
47-
__client = new Lazy<MongoClient>(() => new MongoClient(GetClientSettings()), true);
47+
__linq2Client = new Lazy<MongoClient>(CreateLinq2Client, isThreadSafe: true);
48+
__linq3Client = new Lazy<MongoClient>(CreateLinq3Client, isThreadSafe: true);
4849
__clientWithMultipleShardRouters = new Lazy<MongoClient>(() => CreateClient(useMultipleShardRouters: true), true);
4950
__databaseNamespace = CoreTestConfiguration.DatabaseNamespace;
5051
__directClientsToShardRouters = new Lazy<IReadOnlyList<IMongoClient>>(
5152
() => CreateDirectClientsToHostsInConnectionString(CoreTestConfiguration.ConnectionStringWithMultipleShardRouters).ToList().AsReadOnly(),
5253
isThreadSafe: true);
5354
__collectionNamespace = new CollectionNamespace(__databaseNamespace, "testcollection");
54-
__linq3Client = new Lazy<MongoClient>(CreateLinq3Client, isThreadSafe: true);
5555
}
5656

5757
// public static properties
@@ -60,7 +60,7 @@ static DriverTestConfiguration()
6060
/// </summary>
6161
public static MongoClient Client
6262
{
63-
get { return __client.Value; }
63+
get { return Linq3Client; }
6464
}
6565

6666
/// <summary>
@@ -101,6 +101,14 @@ public static DatabaseNamespace DatabaseNamespace
101101
get { return __databaseNamespace; }
102102
}
103103

104+
/// <summary>
105+
/// Gets the LINQ2 test client.
106+
/// </summary>
107+
public static MongoClient Linq2Client
108+
{
109+
get { return __linq2Client.Value; }
110+
}
111+
104112
/// <summary>
105113
/// Gets the LINQ3 test client.
106114
/// </summary>
@@ -186,9 +194,16 @@ public static DisposableMongoClient CreateDisposableClient(MongoClientSettings s
186194
return new DisposableMongoClient(new MongoClient(settings), settings.LoggingSettings.ToInternalLoggerFactory()?.CreateLogger<DisposableMongoClient>());
187195
}
188196

197+
private static MongoClient CreateLinq2Client()
198+
{
199+
var linq2ClientSettings = GetClientSettings();
200+
linq2ClientSettings.LinqProvider = LinqProvider.V2;
201+
return new MongoClient(linq2ClientSettings);
202+
}
203+
189204
private static MongoClient CreateLinq3Client()
190205
{
191-
var linq3ClientSettings = Client.Settings.Clone();
206+
var linq3ClientSettings = GetClientSettings();
192207
linq3ClientSettings.LinqProvider = LinqProvider.V3;
193208
return new MongoClient(linq3ClientSettings);
194209
}

tests/MongoDB.Driver.Tests/AggregateFluentBucketTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using MongoDB.Bson.TestHelpers;
2424
using MongoDB.Driver.Core.Misc;
2525
using MongoDB.Driver.Core.TestHelpers.XunitExtensions;
26+
using MongoDB.Driver.Linq;
2627
using Xunit;
2728

2829
namespace MongoDB.Driver.Tests
@@ -39,7 +40,7 @@ public class AggregateFluentBucketTests
3940
static AggregateFluentBucketTests()
4041
{
4142
var databaseNamespace = DriverTestConfiguration.DatabaseNamespace;
42-
__database = DriverTestConfiguration.Client.GetDatabase(databaseNamespace.DatabaseName);
43+
__database = DriverTestConfiguration.Linq2Client.GetDatabase(databaseNamespace.DatabaseName);
4344
__collectionNamespace = DriverTestConfiguration.CollectionNamespace;
4445
__ensureTestData = new Lazy<bool>(CreateTestData);
4546
}
@@ -155,7 +156,7 @@ public void Bucket_typed_should_add_expected_stage()
155156
var stage = result.Stages.Single();
156157
var serializerRegistry = BsonSerializer.SerializerRegistry;
157158
var exhibitSerializer = serializerRegistry.GetSerializer<Exhibit>();
158-
var renderedStage = stage.Render(exhibitSerializer, serializerRegistry);
159+
var renderedStage = stage.Render(exhibitSerializer, serializerRegistry, LinqProvider.V2);
159160
renderedStage.Document.Should().Be("{ $bucket : { groupBy : \"$year\", boundaries : [ 1900, 1920, 1950 ], default : \"Unknown\" } }");
160161
}
161162

@@ -195,7 +196,7 @@ public void Bucket_typed_with_output_should_add_expected_stage()
195196
var stage = result.Stages.Single();
196197
var serializerRegistry = BsonSerializer.SerializerRegistry;
197198
var exhibitSerializer = serializerRegistry.GetSerializer<Exhibit>();
198-
var renderedStage = stage.Render(exhibitSerializer, serializerRegistry);
199+
var renderedStage = stage.Render(exhibitSerializer, serializerRegistry, LinqProvider.V2);
199200
renderedStage.Document.Should().Be("{ $bucket : { groupBy : \"$year\", boundaries : [ 1900, 1920, 1950 ], default : \"Unknown\", output : { Years : { $push : \"$year\" }, Count : { $sum : 1 } } } }");
200201
}
201202

0 commit comments

Comments
 (0)