Skip to main content
edited tags
Link
Guru Stron
  • 150.1k
  • 11
  • 186
  • 231
deleted 38 characters in body; edited title
Source Link
marc_s
  • 759.8k
  • 186
  • 1.4k
  • 1.5k

NET.NET 9 -> .NET 10: MongoDB query using array.Contains throws NotSupportedException

After upgrading from .NET 9 to .NET 10, a MongoDB query that used to work now throws a System.NotSupportedExceptionSystem.NotSupportedException during query evaluationexecution. I’mI'm looking for pointers whether this is a runtime change in .NET 10, a MongoDB driver bug, or something I’mI'm doing wrong?

  System.NotSupportedException
  HResult=0x80131515
  Message=Specified method is not supported.
  Source=System.Private.CoreLib
  StackTrace:
   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](Expression`1 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](Expression`1 expression, IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
   at MongoDB.Driver.ExpressionFilterDefinition`1.Render(RenderArgs`1 args)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
   at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.<FindAsync>d__55`1.MoveNext()
   at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__17`1.MoveNext()

System.NotSupportedException
HResult=0x80131515
Message=Specified method is not supported.
Source=System.Private.CoreLib

StackTrace:
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()

  1. Is this a behavioral change in .NET 10 that prevents using a captured array’s Containsarray's Contains method inside MongoDB LINQ expressions? The same code worked on .NET 9 but now throws System.NotSupportedExceptionSystem.NotSupportedException.

  2. Are LINQ methods that operate on captured collections (for example ContainsContains, AnyAny, CountCount) no longer safe to use inside expressions passed to IMongoCollection.Find(...)IMongoCollection<T>.Find(...) with the MongoDB.Driver? If so, which methods are affected?

  3. Is Builders.Filter.In(...)Builders<T>.Filter.In(...) the recommended long-term solution for this scenario, or should the LINQ provider accept array.Contains(x)array.Contains(x) again? Are there performance or correctness differences I should be aware of when switching to Filter.InFilter.In?

NET 9 -> .NET 10: MongoDB query using array.Contains throws NotSupportedException

After upgrading from .NET 9 to .NET 10 a MongoDB query that used to work now throws a System.NotSupportedException during query evaluation. I’m looking for pointers whether this is a runtime change in .NET 10, a MongoDB driver bug, or something I’m doing wrong?

  System.NotSupportedException
  HResult=0x80131515
  Message=Specified method is not supported.
  Source=System.Private.CoreLib
  StackTrace:
   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](Expression`1 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](Expression`1 expression, IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
   at MongoDB.Driver.ExpressionFilterDefinition`1.Render(RenderArgs`1 args)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
   at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.<FindAsync>d__55`1.MoveNext()
   at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__17`1.MoveNext()
  1. Is this a behavioral change in .NET 10 that prevents using a captured array’s Contains inside MongoDB LINQ expressions? The same code worked on .NET 9 but now throws System.NotSupportedException.

  2. Are LINQ methods that operate on captured collections (for example Contains, Any, Count) no longer safe to use inside expressions passed to IMongoCollection.Find(...) with the MongoDB.Driver? If so, which methods are affected?

  3. Is Builders.Filter.In(...) the recommended long-term solution for this scenario, or should the LINQ provider accept array.Contains(x) again? Are there performance or correctness differences I should be aware of when switching to Filter.In?

.NET 9 -> .NET 10: MongoDB query using array.Contains throws NotSupportedException

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?

System.NotSupportedException
HResult=0x80131515
Message=Specified method is not supported.
Source=System.Private.CoreLib

StackTrace:
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()

  1. Is this a behavioral change in .NET 10 that prevents using a captured array's Contains method inside MongoDB LINQ expressions? The same code worked on .NET 9 but now throws System.NotSupportedException.

  2. Are LINQ methods that operate on captured collections (for example Contains, Any, Count) no longer safe to use inside expressions passed to IMongoCollection<T>.Find(...) with the MongoDB.Driver? If so, which methods are affected?

  3. Is Builders<T>.Filter.In(...) the recommended long-term solution for this scenario, or should the LINQ provider accept array.Contains(x) again? Are there performance or correctness differences I should be aware of when switching to Filter.In?

Source Link
mrcode
  • 567
  • 2
  • 6
  • 19

NET 9 -> .NET 10: MongoDB query using array.Contains throws NotSupportedException

After upgrading from .NET 9 to .NET 10 a MongoDB query that used to work now throws a System.NotSupportedException during query evaluation. 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.CoreLib
  StackTrace:
   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](Expression`1 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](Expression`1 expression, IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
   at MongoDB.Driver.ExpressionFilterDefinition`1.Render(RenderArgs`1 args)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
   at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.<FindAsync>d__55`1.MoveNext()
   at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__17`1.MoveNext()

Working:

var filter = Builders<User>.Filter.In(p => p.UserId, ids);
  1. Is this a behavioral change in .NET 10 that prevents using a captured array’s Contains inside MongoDB LINQ expressions? The same code worked on .NET 9 but now throws System.NotSupportedException.

  2. Are LINQ methods that operate on captured collections (for example Contains, Any, Count) no longer safe to use inside expressions passed to IMongoCollection.Find(...) with the MongoDB.Driver? If so, which methods are affected?

  3. Is Builders.Filter.In(...) the recommended long-term solution for this scenario, or should the LINQ provider accept array.Contains(x) again? Are there performance or correctness differences I should be aware of when switching to Filter.In?