我在 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# 变量设为常量,看看是否有帮助,但没有区别。
鉴于它是 C# 中的同一个物理变量,是否可以让 LinqToSql 只传递这个变量一次?这只是一个简单的例子,但在更复杂的查询中,我多次传递同一个变量,我最终会在 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。