【问题标题】:How to get data from the database into objectlists fast (with entity framework)如何快速从数据库中获取数据到对象列表中(使用实体框架)
【发布时间】:2015-01-08 20:28:28
【问题描述】:

我在实体框架对象上使用 linq 语句将数据库中的数据获取到对象列表中。我的问题是,说它好听的表现太糟糕了。对于我处理的几百或几千行,这需要几秒钟。

我将在下面进一步添加一个代码示例,但首先我想解释一下为什么我将获得的数据放入对象列表中,然后我将提出我的问题:

我将数据放入对象列表中,以便轻松访问数据并填充网格视图,填充组合框,并能够使用对象内部的其他方法进行计算和数据收集。

我很确定这个用例并不罕见,而且我得到的性能真的很糟糕.所以我的问题是我可以做些什么来提高性能(或者我是否需要完全抛弃我的设计理念并完全不同......如果是的话如何)?

代码示例:

对象存储在数据层的对象类中,其中也有数据收集方法(如果这里有错误,请告诉我,因为我是从内存中输入的):

public class myobject
{
    public id;
    public name;

    public static List<myobject> GetData()
    {
         using (myentities entity = new myentities())
         {
              List<myobject> resultList = (from e in entity.mytable select new myobject{ id=e.id, name=e.name}).ToList();
         }
    }
}

例如,当我调用 myobject.GetData() 几次以填充 3 个组合框时,问题是对于几十个条目,每个条目可能需要将近半秒。如果我有几千个条目,则超过 1 秒。在尝试了一下之后,我发现即使使用(从而创建新的连接)并没有真正产生影响,性能真的源于我如何使用/获取对象列表(linq 应该生成的 sql 和我一样快通常期望当我在 sql server maanagement studio 中执行此操作时)。

更新 我做了一些测试,也有点奇怪: 当我使用 String 而不是对象时,它仍然很慢,并且 ToList 本身花费的时间太长。例如,如果我取回 68 个条目,则需要 1.7 秒。其中 0.5 是 ToList 方法(这种现象很明显,因为只有在调用 tolist 时才准备和收集数据,但是之前的 1.7 秒太长了,只有几 k 数据行)。

public static void GetNameData()
{
     using (myentities entity = new myentities())
     {
          (from e in entity.mytable select e.name).Distinct().ToList();
     }
}

【问题讨论】:

  • 如果数据不经常更改,您可以缓存并从缓存中检索。
  • 我在上面使用的程序包括一个数据库条目列表和一个编辑器来更改它们(所以遗憾的是,程序本身的目的最终是为了准确地更改数据)a
  • 好吧,除了确保 Web 服务器和数据库服务器可以更快地相互通信之外,似乎没有很多方法可以优化它。您可以使用async programming 同时拉取所有数据,它专为同时进行多个数据库调用而设计。
  • 哎呀。提到网络的 Tnx 忘记通过标签提到它的 winforms。我想知道如果 tehre 真的不能做更多的事情。作为这样的表现,我的意思是用 Vs 编程的大型程序也可能使用实体框架,如果没有办法在一个用户无需等待太多时间
  • 就像我说的,找到你的瓶颈。直到你发现你慢的地方,你才能进行优化。尝试直接使用 ADO 执行 SQL 命令,看看会发生什么。

标签: c# winforms linq visual-studio-2013 entity-framework-6


【解决方案1】:

您提供的代码,数据大小为“几十”和“一千”,应该快如闪电。当然,除非您返回包含数百万列的查询,或者除非您对 ORM 设置做了一些非常奇怪的事情。

首先,检查您的数据库服务器。它可能以低优先级运行,它的索引可能完全搞砸了,它可能有缓慢的网络连接,或者 (...)。

顺便说一句。您是否总是获取整个表格,或者您只是在代码示例中删除了过滤器?如果它在没有过滤器的情况下工作得更快,请检查数据库索引。否则,请检查网络。

另外,请尝试在本地设置数据库。如果它太大,修剪它,它只是测试。然后重试并检查需要多长时间。它应该很快。如果不是 - 那么您可以真正开始假设您的 EF 配置、缓存、数据处理在您的应用程序中损坏了。

【讨论】:

  • 列数应该在 2 到 30 之间。 (即使 2 比我预期的要慢)。使用过滤器(例如在 id 上)它比没有过滤器要快。我还看到每个命令大约有 1/4 的时间进入 ToList(如果一个语句大约需要 2 秒,如果我不使用 ToList 则获得 0.5 秒)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多