4

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を使用しています。

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 に答える