Ошибки сборки IAsyncQueryProvider после перехода на. Net Core v3.1 - PullRequest
0 голосов
/ 14 февраля 2020

После переноса проекта из. NET Core 2.2 в версию 3.1 я получил ошибку с IAsyncEnumerator & IAsyncQueryProvider:

  1. Тип 'IAsyncEnumerable' существует в обоих файлах System.Interactive.Asyn *. 1019 *, версия = 3.0.3000.0, культура = нейтральная, PublicKeyToken = 94bc3704cddfc263 'и' System.Runtime, версия = 4.2.2.0
  2. 'TestAsyncQueryProvider' не реализует элемент интерфейса 'IAsyncQueryProvider.ExecuteAsyn c ( Выражение). «TestAsyncQueryProvider.ExecuteAsyn c (выражение)» не может реализовать «IAsyncQueryProvider.ExecuteAsyn c (выражение)», поскольку у него нет соответствующего возвращаемого типа «IAsyncEnumerable».

Мне удалось выполнить Решите первую проблему, связанную с IAsyncEnumerable, с помощью этого исправления, которое я обнаружил в Google:

  <Target Name="ChangeAliasesOfReactiveExtensions" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'System.Interactive.Async'">
        <Aliases>ix</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>

Однако я не могу найти решения для второй проблемы.

Пример кода, в котором я получаю ошибка:

internal class TestAsyncQueryProvider<TEntity> : IAsyncQueryProvider
    {
        private readonly IQueryProvider _inner;

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

        public IQueryable CreateQuery(Expression expression)
        {
            return new TestAsyncEnumerable<TEntity>(expression);
        }

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

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

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

        public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)
        {
            return new TestAsyncEnumerable<TResult>(expression);
        }

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

Интересно, кто-нибудь сталкивался с подобными проблемами и сумел их решить. Также стоит упомянуть, что я все еще использую EF Core v2.x и еще не перенес его в версию 3.

1 Ответ

1 голос
/ 14 февраля 2020

Интерфейс для Execute был заменен на ExecuteAsyn c в обновлении IdentityServer.

Существует библиотека, которая успешно обновила эту ложную реализацию до. NET Core 3.0:

https://github.com/romantitov/MockQueryable/blob/master/src/MockQueryable/MockQueryable/TestAsyncEnumerable.cs

...