【问题标题】:IAsyncQueryProvider build errors after migrating to .Net Core v3.1迁移到 .Net Core v3.1 后 IAsyncQueryProvider 生成错误
【发布时间】:2020-05-30 10:37:01
【问题描述】:

将项目从 .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。

【问题讨论】:

  • 错误信息是 C# 101... 你的TestAsyncQueryProvider 类实现的IAsyncQueryProvider 接口已经从 2.2 更改为 3.1,所以你需要更新你的类以符合更新后的接口。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,以前看过。似乎摆脱此错误的唯一方法是通过添加对 EF 核心的引用将其更新到版本 3.x:
猜你喜欢
  • 2021-11-25
  • 2019-12-10
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
相关资源
最近更新 更多