0

I'm converting a .NET Framework 4.7.2 project to .NET 6. I'm having trouble figuring out how to convert this properly, or if I should even use it.

The code is from the following post: How to return empty IQueryable in an async repository method

public static class EnumerableExtensions {
    public static IQueryable<T> AsAsyncQueryable<T>(this IEnumerable<T> source) {
        return new AsyncQueryableWrapper<T>(source);
    }

    public static IQueryable<T> AsAsyncQueryable<T>(this IQueryable<T> source) {
        return new AsyncQueryableWrapper<T>(source);
    }
}

internal class AsyncQueryableWrapper<T> : IAsyncEnumerable<T>, IQueryable<T> {
    private readonly IQueryable<T> _source;

    public AsyncQueryableWrapper(IQueryable<T> source) {
        _source = source;
    }

    public AsyncQueryableWrapper(IEnumerable<T> source) {
        _source = source.AsQueryable();
    }

    public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default) {
        return new AsyncEnumerator<T>(this.AsEnumerable().GetEnumerator());
    }

    IAsyncEnumerator IAsyncEnumerable.GetAsyncEnumerator() {
        return GetAsyncEnumerator();
    }

    public IEnumerator<T> GetEnumerator() {
        return _source.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }

    public Expression Expression => _source.Expression;
    public Type ElementType => _source.ElementType;
    public IQueryProvider Provider => new AsyncQueryProvider<T>(_source.Provider);
}

internal class AsyncEnumerable<T> : EnumerableQuery<T>, IDbAsyncEnumerable<T>, IQueryable<T> {
    public AsyncEnumerable(IEnumerable<T> enumerable)
        : base(enumerable) { }

    public AsyncEnumerable(Expression expression)
        : base(expression) { }

    public IDbAsyncEnumerator<T> GetAsyncEnumerator() {
        return new AsyncEnumerator<T>(this.AsEnumerable().GetEnumerator());
    }

    IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() {
        return GetAsyncEnumerator();
    }

    IQueryProvider IQueryable.Provider => new AsyncQueryProvider<T>(this);
}

internal class AsyncQueryProvider<TEntity> : IDbAsyncQueryProvider {
    private readonly IQueryProvider _inner;

    internal AsyncQueryProvider(IQueryProvider inner) {
        _inner = inner;
    }

    public IQueryable CreateQuery(Expression expression) {
        var t = expression.Type;
        if (!t.IsGenericType) {
            return new AsyncEnumerable<TEntity>(expression);
        }

        var genericParams = t.GetGenericArguments();
        var genericParam = genericParams[0];
        var enumerableType = typeof(AsyncEnumerable<>).MakeGenericType(genericParam);

        return (IQueryable) Activator.CreateInstance(enumerableType, expression);
    }

    public IQueryable<TElement> CreateQuery<TElement>(Expression expression) {
        return new AsyncEnumerable<TElement>(expression);
    }

    public object Execute(Expression expression) {
        return _inner.Execute(expression);
    }

    public TResult Execute<TResult>(Expression expression) {
        return _inner.Execute<TResult>(expression);
    }

    public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken) {
        return Task.FromResult(Execute(expression));
    }

    public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken) {
        return Task.FromResult(Execute<TResult>(expression));
    }
}

internal class AsyncEnumerator<T> : IDbAsyncEnumerator<T> {
    private readonly IEnumerator<T> _inner;

    public AsyncEnumerator(IEnumerator<T> inner) {
        _inner = inner;
    }

    public void Dispose() {
        _inner.Dispose();
    }

    public Task<bool> MoveNextAsync(CancellationToken cancellationToken) {
        return Task.FromResult(_inner.MoveNext());
    }

    public T Current => _inner.Current;

    object IDbAsyncEnumerator.Current => Current;
}
Guru Stron
  • 102,774
  • 10
  • 95
  • 132
RoLYroLLs
  • 3,113
  • 4
  • 38
  • 57
  • Does the duplicate answer your question? – Guru Stron Sep 05 '22 at 18:35
  • 2
    If not, please be more specific about what the problem is. – Xerillio Sep 05 '22 at 18:36
  • Thanks. I did see this before. Unfortunately, I'm not fluent enough to know what I'm doing or if it's correct. Would I replace my code with theirs? Do I check the common methods and try to replace them (I've been doing this but so many errors)? – RoLYroLLs Sep 06 '22 at 00:18

0 Answers0