Skip to content

Commit c79dbe0

Browse files
committed
MemoryExtensions.Contains recognized during translation
1 parent 95808e3 commit c79dbe0

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

Orm/Xtensive.Orm/Core/Extensions/ExpressionExtensions.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,32 @@ public static Expression StripMemberAccessChain(this Expression expression)
315315
return expression;
316316
}
317317

318+
/// <summary>
319+
/// Strips implicit cast operators calls.
320+
/// </summary>
321+
/// <param name="expression">Expression to process.</param>
322+
/// <returns><paramref name="expression"/> with chan of implicit casts removed (if any).</returns>
323+
public static Expression StripImplicitCast(this Expression expression)
324+
{
325+
while (expression.NodeType is ExpressionType.Call or ExpressionType.Convert or ExpressionType.ConvertChecked) {
326+
if (expression.NodeType == ExpressionType.Call) {
327+
var mc = expression as MethodCallExpression;
328+
if (mc.Method.Name.Equals(WellKnown.Operator.Implicit, StringComparison.Ordinal))
329+
expression = mc.Arguments[0];
330+
else
331+
break;
332+
}
333+
else {
334+
var unary = expression as UnaryExpression;
335+
if (unary.Method is not null && unary.Method.Name.Equals(WellKnown.Operator.Implicit, StringComparison.Ordinal))
336+
expression = unary.Operand;
337+
else
338+
break;
339+
}
340+
}
341+
return expression;
342+
}
343+
318344
#endregion
319345
}
320346
}

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,13 @@ protected override Expression VisitMethodCall(MethodCallExpression mc)
531531
return VisitContainsNone(mc.Arguments[0], mc.Arguments[1], context.IsRoot(mc), method.GetGenericArguments()[0]);
532532
}
533533
}
534-
534+
if (methodDeclaringType == typeof(System.MemoryExtensions)) {
535+
var parameters = method.GetParameters();
536+
537+
if (methodName.Equals(nameof(System.MemoryExtensions.Contains), StringComparison.Ordinal) && parameters.Length == 2){
538+
return VisitContains(mc.Arguments[0].StripImplicitCast(), mc.Arguments[1], false);
539+
}
540+
}
535541

536542
// Process local collections
537543
if (mc.Object.IsLocalCollection(context)) {

0 commit comments

Comments
 (0)