C# 带子查询的LINQ查询与查询和foreach

C# 带子查询的LINQ查询与查询和foreach,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我需要收集大量的数据来生成报告。所有这些数据都来自我通过实体框架连接到的数据库。对于这个问题,我尝试了几种不同的方法,但无论我做什么,它似乎都很慢 总的来说,我很好奇,使用具有子查询的LINQ查询是更有效,还是最好先使用foreach,然后再查询这些值 数据库的附加信息很多子查询/循环迭代都会查询数据库中最大的表 示例代码: var b = (from brk in entities.Brokers join pcy in Policies on brk.BrkId equal

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

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

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

首先,性能问题始终需要进行分析,无论一个或另一个解决方案看起来多么合理或逻辑合理

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

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


旁注:一般来说,如果您处理大型或复杂(交织)数据,最好不要使用
实体框架
,尤其是在您关心性能的时候。不确定这是否对你有用

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

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

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


旁注:一般来说,如果您处理大型或复杂(交织)数据,最好不要使用
实体框架
,尤其是在您关心性能的时候。不确定这是否对你有用

如果执行for each和query意味着分别查询数据库中的每一行,那么这将是最慢的方法。SQL中的循环也非常慢,通常比基于集合的等价循环要慢得多。提供您的表结构和查询是您在这里获得真实答案的唯一方法。从我所读到的内容来看……LINQ编译到底层的foreach循环,所以它不会更快。在我看来,它可读性更好,但调试起来更难。一般来说。在数据库中执行尽可能多的数据操作。您能否发布这两种情况的示例,以便我提供更准确的答案?我想一个LINQ查询应该比针对不同值循环执行多个查询更有效。如果您可以共享代码,它将更好地了解您的情况。我将为此添加一个代码结构示例的编辑。如果执行“for each”和“query”表示您分别查询数据库中的每一行,那么这将是最慢的方法。SQL中的循环也非常慢,通常比基于集合的等价循环要慢得多。提供您的表结构和查询是您在这里获得真实答案的唯一方法。从我所读到的内容来看……LINQ编译到底层的foreach循环,所以它不会更快。在我看来,它可读性更好,但调试起来更难。一般来说。在数据库中执行尽可能多的数据操作。您能否发布这两种情况的示例,以便我提供更准确的答案?我想一个LINQ查询应该比针对不同值循环执行多个查询更有效。如果你可以分享代码,它会让你更好地了解你的情况。我会添加一个编辑的代码结构的例子。谢谢你的回复!我希望这个项目我没有和EF联系在一起。。。它已经造成了相当多的发展头痛。然而,我的双手被这一点束缚住了:/
EF
是一款优秀的产品,请不要出错。当事情变得有点复杂时,这可能不是一个最好的解决方案。但它肯定有自己的位置,而且工作做得很好。你当然可以这么做,只是你需要分析一下你的查询,看看到底发生了什么,我想不出一种情况,在这种情况下,对每个数据行查询数据库N次会比对一个数据集查询一次快。但是我知道你不想在不了解环境的情况下推荐。谢谢你的回复!我希望这个项目我没有和EF联系在一起。。。它已经造成了相当多的发展头痛。然而,我的双手被这一点束缚住了:/
EF
是一款优秀的产品,请不要出错。当事情变得有点复杂时,这可能不是一个最好的解决方案。但它肯定有自己的位置,而且工作做得很好。你当然可以这么做,只是你需要分析一下你的查询,看看到底发生了什么,我想不出一种情况,在这种情况下,对每个数据行查询数据库N次会比对一个数据集查询一次快。但我知道你不想在不了解环境的情况下提出建议。
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
}