Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-4577

LINQ3 provider throws ExpressionNotSupportedException when using Unset on a dictionary key

    XMLWordPrintableJSON

Details

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: Unknown Unknown
    • None
    • 2.18.0, 2.19.0
    • None
    • Hide

      1. What would you like to communicate to the user about this feature?
      2. Would you like the user to see examples of the syntax and/or executable code and its output?
      3. Which versions of the driver/connector does this apply to?

      Show
      1. What would you like to communicate to the user about this feature? 2. Would you like the user to see examples of the syntax and/or executable code and its output? 3. Which versions of the driver/connector does this apply to?

    Description

      Summary

      LINQ3 provider throws below exception when using `Unset` on a dictionary key :

      Unhandled exception. MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression must be a constant: value(Program+<>c__DisplayClass0_0).key in o.Keys.get_Item(value(Program+<>c__DisplayClass0_0).key).

      MongoDB server version: 5.0.2 (standalone)
      MongoDB driver version: 2.19.0

      How to Reproduce

      using MongoDB.Bson;
      using MongoDB.Driver;
      using MongoDB.Driver.Linq;
      // Init.
      var mongoUrl = new MongoUrl("mongodb://localhost");
      var settings = MongoClientSettings.FromUrl(mongoUrl);
      settings.LinqProvider = LinqProvider.V3; // WORKS WITH V2.
      var client = new MongoClient(settings);
      var database = client.GetDatabase("default");
      var collection = database.GetCollection<Model>("Models");
       
      // Insert document with key.
      var id = ObjectId.GenerateNewId();
      var key = "key";
      var model = new Model(id, new Dictionary<string, string> { [key] = "value" });
      collection.InsertOne(model);
       
      // ✅ Update value.
      collection.UpdateOne(
          Builders<Model>.Filter.Eq(o => o.Id, id),
          new UpdateDefinitionBuilder<Model>().Set(o => o.Keys[key], "new value"));
       
      // ❌ Remove key.
      collection.UpdateOne(
          Builders<Model>.Filter.Eq(o => o.Id, id),
          new UpdateDefinitionBuilder<Model>().Unset(o => o.Keys[key]));
       
       
      record Model(ObjectId Id, Dictionary<string, string> Keys);
      

      Attachments

        Activity

          People

            robert@mongodb.com Robert Stam
            eessae@gmail.com Mox Poe
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: