迁移到.Net Core v3.1后,IAsyncQueryProvider生成错误

时间:2020-02-14 15:49:48

标签: c# asp.net .net async-await entity-framework-core

将项目从.NET Core 2.2迁移到版本3.1之后,IAsyncEnumerator和IAsyncQueryProvider出现错误:

  1. 类型'IAsyncEnumerable'存在于'System.Interactive.Async,Version = 3.0.3000.0,Culture = neutral,PublicKeyToken = 94bc3704cddfc263'和'System.Runtime,Version = 4.2.2.0
  2. 'TestAsyncQueryProvider'未实现接口成员'IAsyncQueryProvider.ExecuteAsync(Expression)'。 “ TestAsyncQueryProvider.ExecuteAsync(Expression)”无法实现“ IAsyncQueryProvider.ExecuteAsync(Expression)”,因为它没有匹配的返回类型“ 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 个答案:

答案 0 :(得分:1)

在IdentityServer更新中,Execute的接口已替换为ExecuteAsync。

有一个库已成功将此模拟实现升级到.NET Core 3.0:

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