我在C#中有一个变量,我在LinqToSql查询中多次使用它。生成的SQL声明变量两次,即使它是C#
中的相同物理变量C#
const string abc = "ABC";
var test = (from f in DataContext.Foo
where f.Name == abc || f.Description == abc
select f.Field1).ToList();
生成的SQL
exec sp_executesql N'SELECT [t0].[Field1]
FROM [dbo].[Foo] AS [t0]
WHERE ([t0].[Name] = @p0) OR ([t0].[Description] = @p1)',N'@p0 varchar(3),@p1 varchar(3)',@p0='ABC',@p1='ABC'
注意到@ p0和@ p1都是'ABC'。
我已经尝试将C#变量设为常量,看看是否有帮助,但没有任何区别。
是否可以让LinqToSql只传递一次这个变量,因为它是C#中的相同物理变量?这只是一个简单的例子,但在更复杂的查询中,我多次传递相同的变量,最后我在SQL中找到了一个不必要的参数。
请忽略实际的SQL - 这只是一个例子,它可能是任何我只感兴趣参数被声明两次的SQL,即使它是C#中的同一个变量。
Gavin建议使用“let”生成以下SQL:
exec sp_executesql N'SELECT [t1].[Field1]
FROM (
SELECT [t0].[Field1], @p0 AS [value]
FROM [dbo].[Foo] AS [t0]
) AS [t1]
WHERE ([t1].[Name] = [t1].[value]) OR ([t1].[Name] = [t1].[value])',N'@p0 nvarchar(3)',@p0=N'ABC'
因此参数声明一次,但现在使用内部SELECT。
答案 0 :(得分:2)
尝试以下方法。我没有任何设置来测试它,但它可能只是诀窍。
const string abc = "ABC";
var test = (from f in DataContext.Foo
let search = abc
where f.Name == search || f.Description == search
select f.Field1).ToList();
答案 1 :(得分:1)
那是你的Linq2Sql。
我认为一些额外的参数不会对您的系统产生明显的性能影响。
如果您想提高性能,您可能应该关注系统的其他部分。
我不是说查询是完美的(它不是),但你可能不应该担心它。
如果您非常希望获得这些重复参数的索引,而不是手动编写存储过程并构建查询。