【问题标题】:Linq to SQL slow with ForEach使用 ForEach 时 Linq to SQL 很慢
【发布时间】:2014-05-04 22:22:23
【问题描述】:

我被要求加快一个非常长的查询的性能(这里只列出了其中的一部分,但它会给出正在发生的事情的一般概念)。我相信每个陈述的数量(大约 10 个)都会导致这种情况永远持续下去。这会导致浏览器消息“脚本耗时过长”。即使不是这种情况,也需要很长时间才能运行。

我的问题是这样的。难道没有更好的方法吗????

这里是代码。

var query = questions
   .Where(x => !x.IsExcluded)
   .OrderBy(x => x.PrimaryOrder)
   .ThenBy(x => x.SecondaryOrder)
   .GroupBy(x => x.Id);

foreach (var q in query)
{
    var edits = new List<QuestionEdit>();
    var answers = new List<ResponseEntity>();

    foreach (var r in responses.
      Where(x => x.OpportunityContactInterviewQuestionId == q.First().Id))
    {
        answers.Add(new ResponseEntity()
        {
            PrimaryAnswerValue = r.PrimaryAnswerValue,
            PrimaryAnswerText = r.PrimaryAnswerText,
            SecondaryAnswerValue = r.SecondaryAnswerValue,
            SecondaryAnswerText = r.SecondaryAnswerText,
            IsOther = r.IsOther,
            OtherValue = r.OtherValue,
            LoopInstance = r.LoopInstance,
            LoopText = r.LoopText,
            IsSelected = r.IsSelected,
            LowValue = r.LowValue,
            HighValue = r.HighValue
        });
    }
....

【问题讨论】:

  • 你真的同时使用linq-to-sqllinq-to-entitieslinq-to-objects吗?
  • 看起来像那样。我不得不解开这段代码。但是,是的,以上都有。
  • 如果你有足够的内存,可以在本地缓存远程数据,以节省网络时间。
  • 您可能需要发布更多代码。由此看来,q 仅用于从问题中获取 Id,这可以通过 select 而不是 groupby 来完成。然后你也可以结合查询
  • 获取分析器以查看实际执行的 SQL。可能有 N+1 个问题。如果是这样,请阅读 L2S 的 LoadWidth。

标签: linq linq-to-sql linq-to-entities linq-to-objects


【解决方案1】:

我想将您的注意力转移到.GroupBy(x =&gt; x.Id);

GroupBy通常在 LinqTo 中效率很低,因为它的工作方式与 sql group bycommand 不同。

您最终得到的是一个 IGrouping,并且根据您访问该 IGrouping 的方式,您经常会触发一个新的 SELECT 以获取 IGrouping 中的所有行。

在您的示例中,您只使用了 IGrouping 的 Key (Id),我相信您在省略的代码中使用了更多信息。但是,如果您只使用 IGrouping 的键,还有其他方法可以获取该数据。通过选择 Id 然后使用 Distinct(没有 GroupBy)或使用 GroupBy 后跟 .Select(v =&gt; v.Key)

此外,您“需要”通过在适当的时间使用 .ToList().ToArray() 来控制何时实现查询。如果不这样做,您可能会多次执行相同的查询。

正如 Pleun 在 cmets 中所说,使用分析器。或者只需下载 LINQPad 并在那里处理您的查询。 LINQPad 是一个非常宝贵的工具(如果您不需要自动完成,它是免费的)。

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多