LinqToSqlクエリで複数回使用しているC#の変数があります。生成されたSQLは、C#の同じ物理変数であっても、変数を2回宣言します。
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#の同じ物理変数である場合、この変数を1回だけ渡すようにすることは可能ですか?これは単純な例にすぎませんが、同じ変数を複数回通過するより複雑なクエリでは、SQLに不要なパラメータが多数含まれることになります。
実際のSQLは無視してください。これは単なる例です。C#で同じ変数であっても、パラメーターが2回宣言される理由に関心があるSQLであればどれでもかまいません。
「let」を使用したGavinの提案により、次の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を使用しています。