3

我有一种方法执行一些 linq 操作,该方法需要一分钟多的时间从 SQL 中获取 4,000 行并将它们放入对象列表中。我想要做的可以归结为:

  1. 从表中获取所有行
  2. 根据行字段将每一行转换为相应的对象
  3. 返回该对象的列表

换句话说,我有一个对象对应于我的数据库中的一行,我希望 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 查询需要一分钟。我可以以某种方式优化它吗?

4

2 回答 2

3

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

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

这是一个很好的教程,展示了如何使新DbContext方法(用于数据库优先场景)工作。

于 2012-11-21T22:47:31.007 回答
0

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

Article有构造函数吗?如果可以的话,您绝对应该使用默认构造函数,因为您直接分配属性。

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

IE

List<Article> llr = (from row in le.ARTICLE
                     select new Article
                     {
                         ArticleNumber = row.ARTICLE_NUMBER,
                         ArticleTitle = row.TITLE
                     }).ToList();
于 2012-11-21T22:31:56.023 回答