如何优化linq中的“select all”语句,该语句需要大约4000行到对象?

时间:2012-11-21 22:16:46

标签: c# sql linq

我有一个方法做一些linq操作,花了一分多钟从SQL获取4,000行并将它们放入对象列表中。我想做的事情可归结为:

  1. 从表中获取所有行
  2. 根据行字段
  3. 将每一行投射到相应的对象
  4. 返回该对象的列表
  5. 换句话说,我有一个对应于我的数据库中的行的对象,我希望linq返回这些行所在的表中所有对象的列表。

    我正在做的是:

    public List<Article> GetAllArticlesFromDB()
        {
            using (DBEntities le = new DBEntities(this._efConnectionString))
            {
                IQueryable<ARTICLE> x = from row in le.ARTICLE select row;
    
                List<Article> llr = x.Select(r => new Article
                {
                     ArticleNumber = r.ARTICLE_NUMBER,
                     ArticleTitle = r.TITLE,
                }).ToList();
    
                return llr;
            }
        }
    

    麻烦的是,此查询需要一分钟。只有两个字段,一个是int,另一个是最大长度为255的字符串。一个简单的SQL查询就可以在不到一秒的时间内完成。但这个linq查询需要一分钟。我能以某种方式对其进行优化吗?

2 个答案:

答案 0 :(得分:3)

您为实体使用哪种实体框架上下文方法? “旧”实体框架方法生成上下文对象,这些对象都是EntityObject派生对象并引入了很多开销,构建其中4000个可能需要很长时间。更好的方法是使用POCO对象,它们非常小而且速度快,但如果您使用的是Visual Studio 2010和/或EF 4,则可能需要使用different generator(与VS 2012和EF5相比,它允许使用开箱即用的POCO实体的产生。)

您使用哪种EF版本和哪种方法?

Here is a nice tutorial展示了如何使新的DbContext方法(针对数据库优先方案)正常工作。

答案 1 :(得分:0)

让您的数据库为您工作,而不是让应用程序执行所有操作。使用分页或类似方法来提取较少数量的记录,因为实际上没有人会一次查看4000条记录。如果需要过滤,请再次使数据库执行此操作。

Article是否有构造函数?如果可以,你肯定应该使用默认构造函数,因为你直接分配属性。

另外,您是否尝试在一个语句而不是两个语句中运行它?不确定这是否会有更好的表现,但这是一个想法。

List<Article> llr = (from row in le.ARTICLE
                     select new Article
                     {
                         ArticleNumber = row.ARTICLE_NUMBER,
                         ArticleTitle = row.TITLE
                     }).ToList();