2011-03-25 55 views
2

我复制从SQL事件探查LINQ内置SQL查询这里是很烦人一下:Linq查询超级慢?

  1. 它的前缀选择..columnNames ..从(选择..columnNames ..从(选择视图的CNAME) 点评:2条SELECT语句这里是不必要的

  2. 此查询需要14秒,执行

  3. 当我删除的最后一行,包含类似的@p_ LINQ _0所有PARAMS。 ..并在条件中填写参数值并执行完全相同的动态查询,这需要1秒或更少的时间。否则,这个查询在从sql studio执行时需要0秒。这是linq的跛脚。

我可能会移动到这个存储过程,但我很害怕使用LINQ现在

经过进一步研究中,我发现:

查询1:

exec sp_executesql N'SELECT * from TableView WHERE Id = @Id', N'@Id int', @Id = 1 

查询2 :

exec sp_executesql N'SELECT * from TableView WHERE Id = 1' 

查询1需要12秒,查询2需要0秒。这解释了为什么linq查询很慢。所以,现在,这是否意味着我应该总是使用存储过程还是缺少一些东西?

为什么不能微软修复Linq查询建筑,难的是如何解析该字符串和替换,而不是通过那些PARAMS作为参数传递给sp_executesql的

+2

你在说什么查询? – Joren 2011-03-25 18:36:17

+2

这里有问题吗? – forsvarir 2011-03-25 18:36:20

+6

没有看到LINQ查询或生成的SQL,很难给你任何帮助。 – 2011-03-25 18:36:37

回答

6

我与你帕拉姆值。我的意思是,您可能会发现您发现的灾难性表现的原因并找到补救措施。但是在实践中,Linq to SQL会发生这种事情,并花费额外的时间来优化您的Linq语句,以便SQL查询在后端方面更加高效,从而失败了目的。 Linq应该让事情变得更容易。

就我个人而言,我使用Linq-to-SQL或实体框架对单个记录执行CRUD操作。然后用任何大型的SELECT声明,我会直接写一个存储过程,就像我一直以来一样。这似乎是生产力和性能之间的良好折中,对我而言效果很好。

编辑: 实际上,实体框架家伙预计这一点。实体框架在存储过程中效果很好。你可以add a stored proc to your Entity Framework model并获得所有强类型的善良。然后你可以从代码中调用存储过程。

+1

您也可以将存储过程添加到Linq to SQL。请参阅http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx和http://weblogs.asp .net/scottgu/archive/2007/08/23/linq-to-sql-part-7-updates-our-database-using-stored-procedures.aspx – 2011-03-28 18:37:41

0

当谓语动态取出应用特定daysRange 像这样

var query = from v in tableView 
      where v.Id == Id 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.ToList(); 
+0

这不会造成任何区别Sir,I've tried一切。这个问题归结为我在“经过进一步研究后”的问题中所更新的内容。 – WhoIsNinja 2011-03-25 19:15:06

0

这工作,你应该建立的。

ParameterExpression parameterExpression = Expression.Parameter(typeof(TableView), "v"); 
Expression equalsExpression = Expression.Equal(Expression.Property(parameterExpression, "Id"), Expression.Constant(Id)); 
Expression<Func<TableView, bool>> predicate = Expression.Lamda<Func<TableView, bool>>(equalsExpression, parameter); 

var query = from v in tableView 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.Where(predicate).ToList();