.net Linq查询超慢?

.net Linq查询超慢?,.net,linq,ado.net,entity-framework-4,.net,Linq,Ado.net,Entity Framework 4,我从sql profiler复制了由linq构建的sql查询,这里是它的恼人之处: 它的前缀为select..columnNames。。从选择..列名称。。从视图中选择cNames 备注:此处的2条select语句是不必要的 执行此查询需要14秒 当我删除最后一行时,它包含所有参数,如@p_linq_0。。并在where条件中填充参数值,执行与此相同的动态查询,所需时间为1秒或更短。即使在其他情况下,从sql studio执行此查询也需要0秒。这真是太差劲了 我可能会将其移动到存储过程,但我现在

我从sql profiler复制了由linq构建的sql查询,这里是它的恼人之处:

它的前缀为select..columnNames。。从选择..列名称。。从视图中选择cNames 备注:此处的2条select语句是不必要的

执行此查询需要14秒

当我删除最后一行时,它包含所有参数,如@p_linq_0。。并在where条件中填充参数值,执行与此相同的动态查询,所需时间为1秒或更短。即使在其他情况下,从sql studio执行此查询也需要0秒。这真是太差劲了

我可能会将其移动到存储过程,但我现在害怕使用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查询速度慢的原因。那么现在,这是否意味着我应该始终使用存储过程,或者我遗漏了什么


为什么Microsoft不能修复Linq查询构建,解析该字符串并替换参数值而不是将这些参数作为参数传递给sp_executesql有多难?我同意。我的意思是,你可能会发现这场灾难性性能打击的原因,并找到补救办法。但是在实践中,这种事情发生在LINQtoSQL上,并且花费额外的时间来优化Linq语句,使SQL查询在后端的性能更好,这有点违背了目的。林克应该让事情变得更容易

我个人使用LINQtoSQL或实体框架对单个记录执行CRUD操作。然后,对于任何大型SELECT语句,我只需像往常一样编写一个存储过程。这似乎是生产率和性能之间的一个很好的折衷方案,对我来说效果很好

编辑:
事实上,实体框架的家伙们已经预料到了这一点。实体框架可以很好地处理存储过程。你可以得到所有强类型的善良。然后,您可以从代码中调用存储的过程。

您应该动态构建Where谓词,去掉特定于应用程序的daysRange 像这样

这会奏效的

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();

你在说什么查询?如果看不到LINQ查询或生成的SQL,很难给你任何帮助。SQL缓存可能是执行时间差异的原因,假设你第二次尝试版本。当然,这取决于您的设置和查询。daysRange是多少?它应该是v.daysRange吗?在任何情况下,您的第一个查询都不应该花费12秒来执行,除非您在一台12年前的计算机上运行SQL Server,或者数据库非常大且Id没有索引。你有身份证索引吗?那没什么区别,先生,我什么都试过了。问题归结为我在进一步研究后的问题中所更新的内容。您也可以将存储过程添加到Linq to SQL。看到和
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();