【发布时间】: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