4

我在 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。

4

2 回答 2

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();
于 2012-10-31T14:43:05.860 回答
1

这就是你的 Linq2Sql。

我认为一些额外的参数甚至不会对您的系统产生明显的性能影响。

如果您想提高性能,您可能应该查看系统的其他部分。

我并不是说这个查询是完美的(它不是),但你可能不应该担心它。

如果您迫切希望获得这些重复参数的装备,而不是编写存储过程并手动构建查询。

于 2012-10-31T14:29:00.280 回答