带有子查询的 LINQ 查询 VS 查询和 foreach



我需要为生成的报告收集大量数据。所有这些数据都来自我通过实体框架连接到的数据库。对于这个查询,我已经尝试了几种不同的方式,但无论我做什么,它似乎都很慢。

总的来说,我很好奇有一个具有子查询的 LINQ 查询是否更有效,或者做一个 foreach 然后查询这些值更好。

数据库的其他信息 许多子查询/循环迭代将查询数据库中大多数最大的表。

示例代码:

var b = (from brk in entities.Brokers
         join pcy in Policies on brk.BrkId equals pcy.pcyBrkId
         where pcy.DateStamp > twoYearsAgo
         select new returnData
         {
         BroId = brk.brkId,
         currentPrem = (from pcy in Policies
                        where pcy.PcyBrkID = brk.Brk.Id && pcy.InvDate > startDate && pcy.InvDate < endDate
                        select pcy.Premium).Sum(),
         //  5 more similar subqueries
         }).GroupBy(x=> x.BrkId).Select(x=> x.FirstOrDefault()).ToList();

var b = (from brk in entities.Brokers
             join pcy in Policies on brk.BrkId equals pcy.pcyBrkId
             where pcy.DateStamp > twoYearsAgo
             select new returnData
             {
             BroId = brk.brkId
             }).GroupBy(x=> x.BrkId).Select(x=> x.FirstOrDefault()).ToList();
foreach( brk in b){
    // grab data from subqueries here
}

另一个细节可能是,如果我获取主要信息,我可能会过滤掉一些额外的信息,从而减少要在 foreach 中通过的结果。

首先,性能问题总是需要分析,无论一个或另一个解决方案看起来多么合理或合乎逻辑。

也就是说,通常,在使用数据库时,对数据库的访问越少越好。因此,在您的情况下,使用一个通过网络检索大块数据的单个SQL查询可能会更有效,然后在您使用循环等在本地处理它之后。在大多数情况下,本指南必须是最佳解决方案。

显然,一切都取决于数据有多大,网络带宽有多大,以及数据库的速度和调整程度。

旁注:一般来说,如果您处理大型或复杂(交织在一起(的数据,最好完全避免使用Entity Framework,尤其是当您担心性能时。不确定这是否适合您。

最新更新