The provider for the source IQueryable doesn't implement IAsyncQueryProvider

后端 未结 4 1808
执念已碎
执念已碎 2020-12-02 01:50

I have some codes like below, I want to write unit tests my method. But I\'m stuck in async methods. Can you help me please ?

public class Panel
{
    publi         


        
4条回答
  •  离开以前
    2020-12-02 02:07

    You could implement an AsyncEnumerable which can be used like this:

    private readonly IQueryable panels = new AsyncEnumerable(new List() 
    {
        panel
    });
    

    Here is the implementation of it:

    public class AsyncEnumerable : EnumerableQuery, IAsyncEnumerable, IQueryable
    {
        public AsyncEnumerable(IEnumerable enumerable) : base(enumerable) { }
    
        public AsyncEnumerable(Expression expression) : base(expression) { }
    
        public IAsyncEnumerator GetEnumerator()
        {
            return new AsyncEnumerator(this.AsEnumerable().GetEnumerator());
        }
    
        IQueryProvider IQueryable.Provider => new AsyncQueryProvider(this);
    }
    

    The AsyncEnumerator class:

    public class AsyncEnumerator : IAsyncEnumerator
    {
        private readonly IEnumerator _inner;
    
        public AsyncEnumerator(IEnumerator inner)
        {
            _inner = inner;
        }
    
        public void Dispose()
        {
            _inner.Dispose();
        }
    
        public T Current => _inner.Current;
    
        public Task MoveNext(CancellationToken cancellationToken)
        {
            return Task.FromResult(_inner.MoveNext());
        }
    }
    

    The AsyncQueryProvider class:

    public class AsyncQueryProvider : IAsyncQueryProvider
    {
        private readonly IQueryProvider _inner;
    
        internal AsyncQueryProvider(IQueryProvider inner)
        {
            _inner = inner;
        }
    
        public IQueryable CreateQuery(Expression expression)
        {
            return new AsyncEnumerable(expression);
        }
    
        public IQueryable CreateQuery(Expression expression)
        {
            return new AsyncEnumerable(expression);
        }
    
        public object Execute(Expression expression)
        {
            return _inner.Execute(expression);
        }
    
        public TResult Execute(Expression expression)
        {
            return _inner.Execute(expression);
        }
    
        public IAsyncEnumerable ExecuteAsync(Expression expression)
        {
            return new AsyncEnumerable(expression);
        }
    
        public Task ExecuteAsync(Expression expression, CancellationToken cancellationToken)
        {
            return Task.FromResult(Execute(expression));
        }
    }
    

提交回复
热议问题