using MongoDB.Driver; using MongoDB.Driver.Linq; var clientSettings = MongoClientSettings.FromConnectionString("SomeConnectionString"); clientSettings.LinqProvider = LinqProvider.V2; var clientV2 = new MongoClient(clientSettings); clientSettings.LinqProvider = LinqProvider.V3; var clientV3 = new MongoClient(clientSettings); var dbV2 = clientV2.GetDatabase("Test"); var dbV3 = clientV3.GetDatabase("Test"); var collectionV2 = dbV2.GetCollection("Test"); var collectionV3 = dbV3.GetCollection("Test"); var now = DateTime.UtcNow; await collectionV3.InsertOneAsync(new Data() { StartDate = now, SpawnPeriod = SpawnPeriod.LIVE }); // Works. var competitionSetV2 = (await collectionV2.Find("{}").Project(x => new SpawnData(x.StartDate, x.SpawnPeriod)).ToListAsync()).ToHashSet(); // Worked all the way up until 2.18.0. Fails on 2.19.0 in NewExpressionToAggregationExpressionTranslator.GetMatchingPropertyName(). var competitionSetV3 = (await collectionV3.Find("{}").Project(x => new SpawnData(x.StartDate, x.SpawnPeriod)).ToListAsync()).ToHashSet(); ; public class Data { public DateTime StartDate; public SpawnPeriod SpawnPeriod; } public enum SpawnPeriod { LIVE, MIDNIGHT, MORNING, EVENING } public struct SpawnData { public readonly DateTime Date; public readonly SpawnPeriod Period; public SpawnData(DateTime date, SpawnPeriod period) { // Normally there is more complex handling here, value-type semantics are important, there are custom comparison operators, etc. hence the point of this struct. Date = date; Period = period; } public bool Equals(SpawnData other) => Date == other.Date && Period == other.Period; }