@@ -34,6 +34,9 @@ public class ParameterExtractingExpressionVisitor : ExpressionVisitor
3434 private static readonly bool UseOldBehavior35100 =
3535 AppContext . TryGetSwitch ( "Microsoft.EntityFrameworkCore.Issue35100" , out var enabled35100 ) && enabled35100 ;
3636
37+ private static readonly bool UseOldBehavior37176 =
38+ AppContext . TryGetSwitch ( "Microsoft.EntityFrameworkCore.Issue37176" , out var enabled37176 ) && enabled37176 ;
39+
3740 /// <summary>
3841 /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
3942 /// the same compatibility standards as public APIs. It may be changed or removed without notice in
@@ -210,15 +213,32 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp
210213 switch ( method . Name )
211214 {
212215 case nameof ( MemoryExtensions . Contains )
213- when methodCallExpression . Arguments is [ var arg0 , var arg1 ] &&
214- TryUnwrapSpanImplicitCast ( arg0 , out var unwrappedArg0 ) :
216+ when UseOldBehavior37176
217+ && methodCallExpression . Arguments is [ var arg0 , var arg1 ]
218+ && TryUnwrapSpanImplicitCast ( arg0 , out var unwrappedArg0 ) :
215219 {
216220 return Visit (
217221 Expression . Call (
218222 EnumerableMethods . Contains . MakeGenericMethod ( method . GetGenericArguments ( ) [ 0 ] ) ,
219223 unwrappedArg0 , arg1 ) ) ;
220224 }
221225
226+ // In .NET 10, MemoryExtensions.Contains has an overload that accepts a third, optional comparer, in addition to the older
227+ // overload that accepts two parameters only.
228+ case nameof ( MemoryExtensions . Contains )
229+ when ! UseOldBehavior37176
230+ && methodCallExpression . Arguments is [ var spanArg , var valueArg , ..]
231+ && ( methodCallExpression . Arguments . Count is 2
232+ || methodCallExpression . Arguments . Count is 3
233+ && methodCallExpression . Arguments [ 2 ] is ConstantExpression { Value : null } )
234+ && TryUnwrapSpanImplicitCast ( spanArg , out var unwrappedSpanArg ) :
235+ {
236+ return Visit (
237+ Expression . Call (
238+ EnumerableMethods . Contains . MakeGenericMethod ( method . GetGenericArguments ( ) [ 0 ] ) ,
239+ unwrappedSpanArg , valueArg ) ) ;
240+ }
241+
222242 case nameof ( MemoryExtensions . SequenceEqual )
223243 when methodCallExpression . Arguments is [ var arg0 , var arg1 ]
224244 && TryUnwrapSpanImplicitCast ( arg0 , out var unwrappedArg0 )
0 commit comments