【问题标题】:LINQ to Entities this slow?LINQ to Entities 这么慢?
【发布时间】:2012-12-02 21:41:34
【问题描述】:

我在上下文(内存)中有实体,因为我使用 Include()s 加载了它们。

我有大约 25 个实体 (tph),我正在对每个实体运行以下查询:

actTph.TrainingProgramHistory_ConditionAndLoadParameter.Where(x => x.Level == 10).Select(x => x.ConditionAndLoadParameter).ToArray();

TrainingProgramHistory_ConditionAndLoadParameter 和 TrainingProgramHistory_ConditionAndLoadParameter.ConditionAndLoadParameters 都在内存中,因为执行这些查询时,SQL-profile 不会记录任何内容。

每个 TPH 大约有 20 个 TrainingProgramHistory_ConditionAndLoadParameter 相关实体。

运行此查询 25 次(在我的 25 个 TPH 实体上)大约需要 3 秒!

如果我重构这个:

List<ConditionAndLoadParameter> measuredCalps = new List<ConditionAndLoadParameter>();
                    foreach (TrainingProgramHistory_ConditionAndLoadParameter tphCalp in actTph.TrainingProgramHistory_ConditionAndLoadParameter)
                    {
                        if (tphCalp.Level == 10)
                        {
                            measuredCalps.Add(tphCalp.ConditionAndLoadParameter);
                        }
                    }

然后它在 100 毫秒左右运行。

对于内存中的对象,Linq to Entities 怎么这么慢?我做错了什么?

【问题讨论】:

  • 我看到您在这些查询中查询不同的对象 - 第一种情况是 tph,第二种情况是 actTph
  • 它们是一样的,我编辑了我的原始帖子。

标签: .net linq entity-framework linq-to-entities


【解决方案1】:

好吧,是我的错:(

第一个 sn-p 是在一个方法中,它包含一个日志/跟踪行,其中显然使用了 lock()-s,即使这个方法是从同一个线程调用的,调用这些锁也会减慢性能。

在这种情况下,foreach 和 linq 查询在移除锁后产生的性能大致相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多