C# 如何快速将数据从数据库中获取到ObjectList(使用实体框架)

C# 如何快速将数据从数据库中获取到ObjectList(使用实体框架),c#,winforms,linq,visual-studio-2013,entity-framework-6,C#,Winforms,Linq,Visual Studio 2013,Entity Framework 6,我正在实体框架对象上使用linq语句将数据从数据库中获取到对象列表中。我的问题是,说它好的话,它的表现是令人厌恶的。对于我处理的几百或几千行,它需要几秒钟的时间 我将在下面进一步介绍一个代码示例,但首先我想解释为什么我要将获取的数据放入对象列表中,然后我还要回答我的问题: 我将数据放入对象列表中,以便轻松访问数据、填充GridView、填充组合框,并能够使用其他方法进行对象内部的计算和数据收集 因为我很确定这个用例并不罕见,而且我得到的性能真的令人厌恶,我认为要么是我错误地使用了EF,要么是我错

我正在实体框架对象上使用linq语句将数据从数据库中获取到对象列表中。我的问题是,说它好的话,它的表现是令人厌恶的。对于我处理的几百或几千行,它需要几秒钟的时间

我将在下面进一步介绍一个代码示例,但首先我想解释为什么我要将获取的数据放入对象列表中,然后我还要回答我的问题:

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

因为我很确定这个用例并不罕见,而且我得到的性能真的令人厌恶,我认为要么是我错误地使用了EF,要么是我错误地使用了linq语句,要么是我的部分设计思想完全错误。所以我的问题是,我能做些什么来提高性能(或者我需要把我的设计理念完全抛在脑后,做完全不同的事情……如果是的话,怎么做)

代码示例:

对象存储在数据层中的对象类中,数据层中也包含数据收集方法(如果此处有错误,请在我从内存中键入时通知我):


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

首先,检查数据库服务器。它可能以低优先级运行,可能索引完全错误,可能网络连接缓慢,或者(…)

顺便问一下,您是一直获取整个表,还是只是在代码示例中删除了过滤器?如果它在没有过滤器的情况下工作得更快,请检查db索引。否则,请检查网络


此外,请尝试在本地设置数据库。如果它太大,就把它剪下来,这只是测试。然后重试并检查需要多长时间。应该很快。如果不是-那么你可以开始假设你的应用程序中的EF配置、缓存、数据处理被破坏。

如果数据不经常更改,你可以缓存并从缓存中检索数据。我使用的上述程序由数据库条目列表和更改它们的编辑器组成(因此,可悲的是,该计划本身最终的目的是完全改变taht数据)那么,除了确保web服务器和数据库服务器能够更快地相互通信之外,似乎没有很多方法可以优化此功能。您可以通过使用同时提取所有数据,这是一种非常好的设计,可用于同时进行多个DB调用。Ooop.Tnx用于提及web忘记提及其winfo标签rms。我想知道tehre是否真的不能做更多的事情。作为这样的性能,我指的是用Vs编程的大型程序也可能使用实体框架,如果没有办法得到这么“少”的话,凭借这样的性能,微软单凭法庭案例就已经破产了用户无需等待的时间内的数据行。如我所说,找到瓶颈。在找到速度慢的地方之前,您无法进行优化。请尝试直接使用ADO执行SQL命令,看看会发生什么。列数的最大值应在2到30之间(即使比我预期的慢2个)。使用筛选器(例如在id上)它比没有更快。我还看到,每个命令花费的时间大约有1/4进入ToList(如果一个语句花费大约2秒,如果我不使用ToList,则获得0.5秒)
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();
         }
    }
}
public static void GetNameData()
{
     using (myentities entity = new myentities())
     {
          (from e in entity.mytable select e.name).Distinct().ToList();
     }
}