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

C# LinqToSql将单个C变量转换为多个SQL参数,c#,linq-to-sql,C#,Linq To Sql,我有一个C语言的变量,我在LinqToSql查询中多次使用它。生成的SQL声明变量两次,即使它在C中是相同的物理变量 C 生成的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' 注意到@

我有一个C语言的变量,我在LinqToSql查询中多次使用它。生成的SQL声明变量两次,即使它在C中是相同的物理变量

C

生成的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变量设为常量,看看这是否有帮助,但is没有区别

如果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。

这就是Linq2Sql

我认为几个额外的参数甚至不会对系统的性能产生明显的影响

如果您想提高性能,那么您可能需要查看系统的其他部分

我并不是说这个查询是完美的,事实并非如此,但您可能不应该担心它


如果您非常想获得这些重复参数的装备,那么就编写一个存储过程并手动构造查询。

尝试以下方法。我没有任何设置来测试它,但它可能只是做的把戏

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();

为什么这很重要?无论是什么原因或条件,您的查询都会很慢。我不希望将重点放在实际的SQL上-将任何您喜欢的SQL放在其中。这个问题的原因是为什么参数被声明了两次,即使它在CIf中是同一个参数。您担心生成的SQL是否完美,您可能不应该使用ORM。是的,我想这是一个折衷。它创建了两个参数,因为实体就是这样工作的。没有ORM能生成完美的SQL,正如@cadrell0所说,如果你想要完美的SQL,就不要使用ORM。这几乎奏效了——参数声明了一次,但使用了一个内部选择Hanks——我在执行计划缓存和重用方面遇到了问题,所以我想探索每一个选项。不是来自示例的实际查询要长得多,并且使用相同的c参数大约15次,因此认为它可能会对执行计划产生影响
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();