首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#超过100个结果超时循环

c#超过100个结果超时循环
EN

Stack Overflow用户
提问于 2020-12-23 17:16:40
回答 2查看 109关注 0票数 1

我有一个控制器,它从数据库中返回记录列表。如果我请求100个结果,它将在6-8秒内返回。如果我请求500个结果,就会超时

我已经调试了代码,并发现EF核心数据库查询不是问题,它只需要10-20ms。

这里有几乎相同的控制器/扩展,它们都返回<1秒。不知道这里发生了什么。

下面是相关代码:

控制器端点

代码语言:javascript
复制
[HttpGet("Summary")]
[AutoQuery]
[ProducesResponseType(200, Type = typeof(CollectionDTO<MemberCardQueueEntrySummary>))]
public async Task<IActionResult> GetSummary()
{
    // NOTE: takes 10-20ms
    var entries = await memberService.MemberCardQueueEntries().Include(x => x.Account).ThenInclude(x => x.Division).ApplyAutoQuery(HttpContext.Request.Query.ParseQueryString(), out int total).ToListAsync();

    // NOTE: takes 6-8 seconds for smaller result sets and times outs for larger
    var summaries = entries.ToMemberCardQueueEntrySummaryAsync(mapper);
    var results = summaries.ToList();
    return Ok(new CollectionDTO<MemberCardQueueEntrySummary>
    {
        Count = results.Count,
        Total = total,
        Data = results
    });
}

扩展方法,它将一个模型转换为下一个

代码语言:javascript
复制
public static class MemberCardQueueEntryExtensions
{
    public static IEnumerable<MemberCardQueueEntrySummary> ToMemberCardQueueEntrySummaryAsync(this IEnumerable<MemberCardQueueEntry> entries, IMapper mapper)
    {
        var result = new List<MemberCardQueueEntrySummary>();
        foreach (var x in entries)
        {
            result.Add(x.ToMemberCardQueueEntrySummaryAsync(mapper));
        }
        return result;
    }

    public static MemberCardQueueEntrySummary ToMemberCardQueueEntrySummaryAsync(this MemberCardQueueEntry entry, IMapper mapper)
    {
        var result = mapper.Map<MemberCardQueueEntrySummary>(entry);
        result.AccountName = entry?.Account?.Name;
        result.DivisionName = entry?.Account?.Division?.Name;
        return result;
    }
}

自动映射器配置

代码语言:javascript
复制
cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntry>()
    .IgnoreAllVirtual();
cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntryDTO>()
    .IgnoreAllVirtual()
    .ReverseMap();
cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntrySummary>()
    .IgnoreAllVirtual();
EN

回答 2

Stack Overflow用户

发布于 2020-12-23 18:27:25

你试过使用手动映射器而不是自动映射器吗?所以你不需要携带自动驾驶程序中的所有参数。

至少,您可以看到映射程序或对象是否有问题。

代码语言:javascript
复制
Example :
public MemberCardQueueEntrySummary MapTo(MemberCardQueueEntry entry){
    AccountName = entry?.Account?.Name;
    DivisionName = entry?.Account?.Division?.Name;
    ......

}
票数 1
EN

Stack Overflow用户

发布于 2020-12-28 06:51:33

找出不需要autoMapper的请求时间。自动映射器在值为null的情况下工作时间更长。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65428278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档