LINQ查询子查询VS Query和foreach

时间:2018-01-30 14:14:43

标签: c# .net entity-framework linq

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

总的来说,我很好奇是否有一个具有子查询的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();

OR

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中完成。

1 个答案:

答案 0 :(得分:2)

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

通常说,在使用数据库时,您对数据库的访问次数会减少。因此,在您的情况下,可能更有效地拥有一个SQL查询,该查询通过网络检索大块数据,并在您使用循环和诸如此类的东西在本地处理它之后。对于大多数情况,本指南必须是最佳解决方案。

显然,所有这些都取决于数据的大小,网络带宽的大小以及数据库的速度和调整速度。

附注:一般情况下,如果您使用大型或复杂(交织在一起)的数据,最好避免使用Entity Framework,尤其是在您关注性能时。不确定这是否适合你。