我有一个方法做一些linq操作,花了一分多钟从SQL获取4,000行并将它们放入对象列表中。我想做的事情可归结为:
换句话说,我有一个对应于我的数据库中的行的对象,我希望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查询需要一分钟。我能以某种方式对其进行优化吗?
答案 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();