Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions src/EntityFrameworkCoreMock.Shared/DbAsyncQueryProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,35 @@ public TResult ExecuteAsync<TResult>(Expression expression, CancellationToken ca

private static T CompileExpressionItem<T>(Expression expression)
=> Expression.Lambda<Func<T>>(
body: new Visitor().Visit(expression) ?? throw new InvalidOperationException("Visitor returns null"),
parameters: (IEnumerable<ParameterExpression>) null)
.Compile()();
body: new Visitor().Visit(expression) ?? throw new InvalidOperationException("Visitor returns null"),
parameters: (IEnumerable<ParameterExpression>) null)
.Compile()();

private class Visitor : ExpressionVisitor { }
private class Visitor : ExpressionVisitor
{
protected override Expression VisitMethodCall(MethodCallExpression node)
{
var method = node.Method;
if (method.DeclaringType?.FullName == "Microsoft.EntityFrameworkCore.RelationalQueryableExtensions")
{
var fakeMethod = GetType().GetMethod(method.Name);
if (fakeMethod != null)
{
var obj = Visit(node.Object);
var args = Visit(node.Arguments);
return Expression.Call(obj, fakeMethod.MakeGenericMethod(method.GetGenericArguments()), args);
}
}
return base.VisitMethodCall(node);
}

// ReSharper disable once UnusedMember.Local
public static int ExecuteDelete<TSource>(IQueryable<TSource> source) =>
source.Count();

// ReSharper disable once UnusedMember.Local
public static int ExecuteUpdate<TSource>(IQueryable<TSource> source) =>
source.Count();
}
}
}