c# - 使用自动映射器映射异步结果

标签 c# async-await automapper

我们正在创建一个 angularjs 应用程序的 Web.Api 应用程序。 Web.Api 返回一个 json 结果。

第一步是获取数据:

    public List<DataItem>> GetData()
    {
        return Mapper.Map<List<DataItem>>(dataRepository.GetData());
    }

这就像一个魅力。然后我们将数据 repo 设为异步,并更改为代码以使用它。

    public List<DataItem>> GetData()
    {
        return Mapper.Map<List<DataItem>>(dataRepository.GetDataAsync().Result);
    }

仍然没有问题。现在我们想让我的 Web.Api 完全异步,所以我们将其更改为:

    public async Task<List<DataItem>> GetData()
    {
        return await Mapper.Map<Task<List<DataItem>>>(dataRepository.GetDataAsync());
    }

此时 Automapper 感到困惑。首先,我们有以下映射器规则: Mapper.CreateMap();

在 web api 方法变得完全异步之前,这一直有效。异常说它缺少来自

的 map
 Task<ICollection<Data>> to Task<ICollection<DataItem>>.

映射器改为

Mapper.CreateMap<Task<List<Data>>, Task<List<DataItem>>>();

在验证配置时,它会提示无法映射结果。我们应该如何配置映射?

最佳答案

您需要将异步数据提取移出 Map 调用:

var data = await dataRepository.GetDataAsync();
return Mapper.Map<List<DataItem>>(data);

或者,您可以使用 AutoMapper LINQ 投影:

var data = await dbContext.Data.ProjectTo<DataItem>().ToListAsync();

我不知道你的存储库是否直接公开了 IQueryable(我们不使用存储库)。现在,我们的应用几乎完全使用第二个版本。

关于c# - 使用自动映射器映射异步结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609607/

相关文章:

c# - 使用 LINQ 处理文本文件

JavaScript 在迭代数组时等待后端响应

集合中的 C# Automapper AfterMap 属性

c# - Random.Next() 有多随机?

c# - 从其他脚本Unity访问脚本

c# - 在 Page_Load 中调用异步方法

javascript - 使用 yield 作为异步控制流有什么好处?

c# - 如何解决 - 无法使用 Automapper 将 Generic.List 转换为 Linq.IQueryable?

c# - AutoMapper 映射自定义值 ForMember

c# - 如何在 C# 中检索 couchbase 数据库中的键/文档列表