After upgrading from .NET 9 to .NET 10, a MongoDB query that used to work now throws a System.NotSupportedException during query execution. I'm looking for pointers whether this is a runtime change in .NET 10, a MongoDB driver bug, or something I'm doing wrong?
Using: .NET 10, MongoDB.Driver 3.5.0
Code:
public static async Task<List<User>> GetUsers(Guid[] ids)
{
return await Collection.Find(p => ids.Contains(p.UserId)).ToListAsync();
}
Exception:
System.NotSupportedException
HResult=0x80131515
Message=Specified method is not supported.
Source=System.Private.CoreLibStackTrace:
at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at MongoDB.Driver.Linq.Linq3Implementation.Misc.PartialEvaluator.SubtreeEvaluator.Evaluate(Expression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Misc.PartialEvaluator.SubtreeEvaluator.Visit(Expression expression)
at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
at MongoDB.Driver.Linq.Linq3Implementation.Misc.PartialEvaluator.SubtreeEvaluator.Visit(Expression expression)
at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression1 node) at MongoDB.Driver.Linq.Linq3Implementation.Misc.PartialEvaluator.SubtreeEvaluator.Visit(Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Misc.PartialEvaluator.EvaluatePartially(Expression expression) at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToFilter[TDocument](Expression1 expression, IBsonSerializer1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.ExpressionFilterDefinition1.Render(RenderArgs1 args) at MongoDB.Driver.MongoCollectionImpl1.CreateFindOperation[TProjection](FilterDefinition1 filter, FindOptions2 options)
at MongoDB.Driver.MongoCollectionImpl1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition1 filter, FindOptions2 options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.d__551.MoveNext() at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__171.MoveNext()
Working:
var filter = Builders<User>.Filter.In(p => p.UserId, ids);
Is this a behavioral change in .NET 10 that prevents using a captured array's
Containsmethod inside MongoDB LINQ expressions? The same code worked on .NET 9 but now throwsSystem.NotSupportedException.Are LINQ methods that operate on captured collections (for example
Contains,Any,Count) no longer safe to use inside expressions passed toIMongoCollection<T>.Find(...)with the MongoDB.Driver? If so, which methods are affected?Is
Builders<T>.Filter.In(...)the recommended long-term solution for this scenario, or should the LINQ provider acceptarray.Contains(x)again? Are there performance or correctness differences I should be aware of when switching toFilter.In?
