首页 > 解决方案 > 查询后的实体框架性能

问题描述

我在实体中有一个类结构,看起来像这样:

public class Parent
{
    public int Id { get; set; }

    public List<Child> Children { get; set; }

    //Lots more fields....
}

public class Child
{
    public int Id { get; set; }

    public int ParentId { get; set; }

    [ForeignKey("ParentId")]
    public Parent Parent { get; set; }

    //Lots more fields....
}

然后我使用以下代码对这些表运行查询:

Context.Database.Log = s => Debug.Print(s);
var ALL = Stopwatch.StartNew();
var query = context.Parent.Include(x => x.Children).Where(x => //Whatever...).ToList()();
ALL.Stop();
Context.Database.Log = null;

查询调试的输出告诉我查询也需要 773 毫秒,例如不到一秒,但计时器告诉我整个过程需要 2 秒。

鉴于此,我假设额外的一秒左右是 Entity 将数据映射到对象所需的时间 - 任何人都可以确认这是否正确?

更重要的是 - 我的问题是,我有什么选择来减少这个时间?

请注意,此代码:

Context.Database.Log = s => Debug.Print(s);

将执行的实际 SQL 输出到 Visual Studio 中的命令窗口。

标签: c#entity-framework

解决方案


鉴于此,我假设额外的一秒左右是 Entity 将数据映射到对象所需的时间 - 任何人都可以确认这是否正确?

是的,虽然 Entity Framework 上的映射加载时间有所改善,但仍然需要时间。

根据@Mikael Eliasson 的回答 [ 1 ],

  • 您可以使用缓存数据库模型
  • 您可以生成预编译视图
  • 您可以使用 n-gen 生成实体框架的预编译版本以避免抖动(我没有尝试这种方法)
  • 您可以寻找将 DbContext 拆分为多个部分,并根据需要使用多个 DbContexes。

希望这可以帮助


推荐阅读