[CSHARP-3234] InvalidOperationException when check Contains() == false Created: 23/Oct/20  Updated: 27/Oct/23  Resolved: 01/Nov/22

Status: Closed
Project: C# Driver
Component/s: Linq
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Major - P3
Reporter: Mohamad Javad Ebrahimi Assignee: Robert Stam
Resolution: Works as Designed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
is duplicated by CSHARP-2247 Support array.Contains(value) == fals... Closed

 Description   

var selectedIds = new[] { ObjectId.GenerateNewId() };
var result = postCollection
    .AsQueryable()
    .Where(p => selectedIds.Contains(p.Id) == false)
    .ToList();

Message: System.InvalidOperationException : Contains(value(MongoDB.Bson.ObjectId[])) is not supported. 
Stack Trace: 
PredicateTranslator.GetFieldExpression(Expression expression) 
PredicateTranslator.TranslateComparison(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression) 
PredicateTranslator.TranslateComparison(BinaryExpression binaryExpression)
PredicateTranslator.Translate(Expression node) 
PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry) 
QueryableTranslator.TranslateWhere(WhereExpression node) 
QueryableTranslator.Translate(Expression node) 
QueryableTranslator.TranslatePipeline(PipelineExpression node) 
QueryableTranslator.Translate(Expression node) 
QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) 
MongoQueryProviderImpl`1.Translate(Expression expression) 
MongoQueryProviderImpl`1.Execute(Expression expression) 
MongoQueryableImpl`2.GetEnumerator() List`1.ctor(IEnumerable`1 collection) 
Enumerable.ToList[TSource](IEnumerable`1 source)



 Comments   
Comment by Robert Stam [ 01/Nov/22 ]

This issue has been fixed in the new LINQ provider (known as LINQ3), which was introduced in the 2.14 release.

Configure your MongoClientSettings to use LinqProvider.V3 if you want to use this functionality.

To configure a client to use the LINQ3 provider use code like the following

var connectionString = "mongodb://localhost";
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
clientSettings.LinqProvider = LinqProvider.V3;
var client = new MongoClient(clientSettings);

Comment by Githook User [ 01/Nov/22 ]

Author:

{'name': 'rstam', 'email': 'robert@robertstam.org', 'username': 'rstam'}

Message: CSHARP-3234: Verify that Contains equals false works in LINQ3.
Branch: master
https://github.com/mongodb/mongo-csharp-driver/commit/1b6cf127acbe484b2a01fddada04ad3ecaf53832

Comment by Robert Stam [ 26/Oct/20 ]

I can confirm that we do not yet support Contains in this context.

Comment by Mohamad Javad Ebrahimi [ 23/Oct/20 ]

reproduce code

Generated at Wed Feb 07 21:44:45 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.