LinqToSql将单个C#变量转换为多个SQL参数

时间:2012-10-31 14:24:50

标签: c# linq-to-sql

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

2 个答案:

答案 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。

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

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

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

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