我需要为我正在生成的报告收集大量数据。所有这些数据都来自我通过实体框架连接的数据库。对于这个查询,我尝试过几种不同的方式,但无论我做什么,它似乎都很慢。
总的来说,我很好奇是否有一个具有子查询的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中完成。
答案 0 :(得分:2)
首先,无论一个或另一个解决方案看起来多么合理或合乎逻辑,性能问题总是值得进行分析。
通常说,在使用数据库时,您对数据库的访问次数会减少。因此,在您的情况下,可能更有效地拥有一个SQL
查询,该查询通过网络检索大块数据,并在您使用循环和诸如此类的东西在本地处理它之后。对于大多数情况,本指南必须是最佳解决方案。
附注:一般情况下,如果您使用大型或复杂(交织在一起)的数据,最好避免使用Entity Framework
,尤其是在您关注性能时。不确定这是否适合你。