【问题标题】:Asp.net Core Linq query takes too much timeAsp.net Core Linq 查询耗时过长
【发布时间】:2021-07-18 11:20:57
【问题描述】:

我有一个需要 31 秒的 linq 查询。这是我第一次收到这么晚的查询,我不知道该怎么办。 让我告诉你我的查询:

        public IEnumerable<WebFairField> WebFairFieldForFair(Guid ID)
        {
            return TradeTurkDBContext.WebFairField.Where(x => x.DataGuidID==ID)
             .Include(x => x.Category)
             //
             .Include(x=>x.FairSponsors)
             .ThenInclude(x=>x.Company)
             .ThenInclude(x=>x.FileRepos)
             //
             .Include(x=>x.WebFairHalls)
             .ThenInclude(x=>x.HallSeatingOrders)
             .ThenInclude(x=>x.Company)
             .ThenInclude(x=>x.FileRepos)
             //
             .Include(x=>x.HallExpertComments)
             .Include(x=>x.Products)
             .Include(x=>x.FairSponsors)
             .AsNoTracking().ToList();
        }

我确定这是一个正确的查询,但我不知道为什么该查询花费了太多时间。

感谢您的帮助!!

【问题讨论】:

    标签: asp.net asp.net-mvc linq entity-framework-core ef-code-first


    【解决方案1】:

    它被称为笛卡尔爆炸。 EF Core 生成 SQL,它返回大量记录,这些记录将在客户端聚合。

    示意图:FairSponsors * FairSponsor.Company.FileRepos * WebFairHalls * WebFairHall.HallSeatingOrders * WebFairHall.HallSeatingOrder.Company.FileRepos * HallExpertComments * Poducts * FairSponsors。记录太多了,不是吗?

    EF Core 有运算符 AsSplitQuery()。尝试应用于您的查询,它可能会加快返回结果,但不会太多。在Include 中请求的每个集合都会产生额外的查询。

    还可以尝试删除AsNoTracking() 或添加AsNoTrackingWithIdentityResolution() - 在这种情况下,跟踪可能会提高查询速度。

    【讨论】:

    • 我不会对这些数据进行粗略的操作,我只是想展示它们,但也许你是对的。我会尽力给你一个反馈
    • 也试试 AsNoTrackingWithIdentityResolution
    • 伙计,你教我一些很棒的东西!花了大约 1 秒钟。非常感谢你的努力。我很担心我的数据库设计,但现在它甚至不是问题。非常感谢你!!!!!!1
    • 究竟有什么帮助? ;)
    • 我添加了 AsSplitQuery 并删除了 AsNoTracking() 。我尝试添加AsSplitQuery 并添加AsNoTrackingWithIdentityResolution(),但他们在同一时间做。 ``` AsSplitQuery``` 帮助了我很多,再次感谢
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 2016-03-12
    • 2019-08-02
    • 2015-10-23
    • 2012-11-04
    • 2013-07-24
    • 2015-09-08
    相关资源
    最近更新 更多