Use of an untranslatable property reference in a LINQ expression should be executed client-side

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Fixed
    • Priority: Unknown
    • 3.7.0
    • Affects Version/s: None
    • Component/s: None
    • None
    • None
    • Fully Compatible
    • Dotnet Drivers
    • Not Needed
    • None
    • None
    • None
    • None
    • None
    • None

      Summary

       

      Client-side projection (EnableClientSideProjections=true) of a property marked with [{}}}BsonIgnore\{*}{\{{}*] leads to an exception:

       

      System.InvalidOperationException : Serializer for MongoCases.MongoCases_Linq3_Project_WithIgnoreField+UserDbo does not have a member named MainEmail. at MongoDB.Driver.Linq.Linq3Implementation.Misc.DocumentSerializerHelper.GetMemberSerializationInfo(IBsonSerializer serializer, String memberName) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MemberExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberInitExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression, NewExpression newExpression, IReadOnlyList`1 bindings) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.NewExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, NewExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, Symbol parameterSymbol) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, IBsonSerializer parameterSerializer, Boolean asRoot) at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToProjection[TInput,TOutput](Expression`1 expression, IBsonSerializer`1 inputSerializer, ExpressionTranslationOptions translationOptions, Boolean forFind) at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToFindProjection[TSource,TProjection](Expression`1 expression, IBsonSerializer`1 sourceSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.FindExpressionProjectionDefinition`2.Render(RenderArgs`1 args)

       

       

      <PackageReference Include="MongoDB.Bson" Version="3.5.2" />
      <PackageReference Include="MongoDB.Driver" Version="3.5.2" />

       

      How to Reproduce

       

      [TestFixture]
      public class MongoCases_Linq3_Project_WithIgnoreField
      {
          [Test]
          public async Task Test()
          {
              BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy));
      
              var mongoClientSettings = MongoClientSettings.FromConnectionString("mongodb://localhost:27017");
              var mongoClient = new MongoClient(mongoClientSettings);
              var db = mongoClient.GetDatabase(Guid.NewGuid().ToString()[..8]);
              var collection = db.GetCollection<UserDbo>("users");
              var guid = Guid.NewGuid();
      
              var userDbo = new UserDbo
              {
                  Id = guid
              };
              await collection.InsertOneAsync(userDbo);
      
              var query = collection
                  .Find(Builders<UserDbo>.Filter.Empty,
                      new FindOptions
                      {
                          TranslationOptions = new ExpressionTranslationOptions
                          {
                              EnableClientSideProjections = true
                          }
                      })
                  .Project(x => new UserDto(x.Id, x.MainEmail));
      
              var userInfo = await query.FirstOrDefaultAsync();
      
              // System.InvalidOperationException : Serializer for MongoCases.MongoCases_Linq3_Project_WithIgnoreField+UserDbo does not have a member named MainEmail.
              //  at MongoDB.Driver.Linq.Linq3Implementation.Misc.DocumentSerializerHelper.GetMemberSerializationInfo(IBsonSerializer serializer, String memberName)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MemberExpression expression)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberInitExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression, NewExpression newExpression, IReadOnlyList`1 bindings)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.NewExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, NewExpression expression)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, Symbol parameterSymbol)
              //  at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, IBsonSerializer parameterSerializer, Boolean asRoot)
              //  at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToProjection[TInput,TOutput](Expression`1 expression, IBsonSerializer`1 inputSerializer, ExpressionTranslationOptions translationOptions, Boolean forFind)
              //  at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToFindProjection[TSource,TProjection](Expression`1 expression, IBsonSerializer`1 sourceSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
              //  at MongoDB.Driver.FindExpressionProjectionDefinition`2.Render(RenderArgs`1 args)
      
              Assert.That(userInfo, Is.Not.Null);
          }
      
          private sealed class UserDto
          {
              public UserDto(Guid id, string? mainEmail)
              {
                  Id = id;
                  MainEmail = mainEmail;
              }
              public Guid Id { get; }
              public string? MainEmail { get; }
          }
      
          private class UserDbo
          {
              [BsonId]
              public Guid Id { get; set; }
              [BsonElement("emails"), BsonRequired]
              public IEnumerable<string> Emails { get; set; }
              [BsonIgnore]
              public string? MainEmail => Emails?.FirstOrDefault();
          }
      }
       

       

       

      Additional Background

      Please provide any additional background information that may be helpful in diagnosing the bug.

            Assignee:
            Robert Stam (Inactive)
            Reporter:
            flibustier seas
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: