如何解决是否可以防止LINQ在查询中使用变量,而是使用字符串文字?
| 我有一个包含大量变量的LINQ查询,生成的SQL看起来像:exec sp_executesql N\'SELECT col1,col2
FROM MyTable [t3]
WHERE
(([t3].[col1] = @p0) AND ([t3].[col2] = @p1))
OR (([t3].[col1] = @p2) AND ([t3].[col2] = @p3))
...
N\'@p0 varchar(32),@p1 varchar(32),@p2 varchar(32),@p3 varchar(32),...,@p0=\'0\',@p1=\'1\',@p2=\'2\',@p3=\'3\',...
只要没有太多变量(例如150个或更少),此方法就可以正常工作。但是,如果变量太多,查询速度将大大降低。
如果我有相同的查询,除了没有变量,例如:
SELECT col1,col2
FROM MyTable [t3]
WHERE
(([t3].[col1] = \'0\') AND ([t3].[col2] = \'1\'))
OR (([t3].[col1] = \'2\') AND ([t3].[col2] = \'3\'))
...
这样,即使存在许多OR条件,查询也可以正常工作。
虽然我相信这确实是SQL Server在变量过多时表现不佳的问题,但我想知道是否可以通过不让生成的SQL包含对变量的引用,而是使用字符串文字来解决LINQ中的此问题。
我意识到我可以通过不使用LINQ来解决此问题,而是自己构造SQL,但希望拥有LINQ解决方案。
同样,尽管这个问题与LINQ有关,但是如果有一种解决方案来加快涉及SQL Server的查询,我也会对此感兴趣。我应该补充一点,我在SQL Server 2005中看到了这个问题。
谢谢你的帮助,
埃里克
解决方法
我不相信。实际上,Linq的功能之一是它可以防止用户受到Sql Injection攻击。
如果将查询参数加载到表中,然后将查询作为对表的联接来运行,则可能会有更好的性能。
, 这个问题很广泛。 LINQ本身很可能与查询性能无关。
如果查询中有很多“ 2”,这就是SQL查询优化器对要使用的索引感到困惑的原因。
我认为您首先需要专注于SQL查询优化,添加适当的索引。优化SQL查询后,LINQ将不会出现问题。
[编辑]
如果使用字符串文字,可能会导致性能下降,因为SQL查询优化器将无法重用查询计划。每个查询将触发新的查询计划生成。
, 正如其他人所述,参数不是问题。无论查询是否已参数化,where子句中的许多OR都会使SQL Server感到困惑。
一种解决方法是将查询更改为UNION查询,每个OR都使用一个UNION。
例如。:
select ... from MyTable as t0 where t0.col1 = 0 and t0.col2 = 1
union all
select ... from MyTable as t1 where t1.col1 = 2 and t0.col2 = 3
您可以使用LINQ .Union方法轻松地构建类似于循环的查询:
List<Tuple<int,int>> IDPairs = new List<Tuple<int,int>> { new Tuple<int,int>(0,1),new Tuple<int,int>(2,3) }
IQueryable<MyTable> query = null;
foreach (Tuple<int,int> IDs in IDPairs)
{
if (query == null)
{
query = dc.MyTable.Where(w => w.Col1 == IDs.Item1 && w.Col2 == IDs.Item2);
}
else
{
query = query.Union(dc.MyTable.Where(w => w.Col1 == IDs.Item1 && w.Col2 == IDs.Item2));
}
}
var result = query.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。