24

こんにちは、私はこのlinqコードを持っています

var fp = lnq.attaches.First(a => a.sysid == sysid).name;

プロファイリングすると、次の t-sql が生成されます

SELECT TOP (1) [t0].[sysid], [t0].[name], [t0].[att_size], [t0].[cid], [t0].[flags], [t0].[contents] 
FROM [lntmuser].[attach] AS [t0]

私の見方では、それはselect *のように返されます。これにより、クエリはインデックスを使用するのではなく、テーブルスキャンを実行します。パフォーマンスが悪い。

次のように、名前の列だけを選択するにはどうすればよいですか。

SELECT TOP (1)[t0].[name] FROM [lntmuser].[attach] AS [t0]

前もって感謝します


編集:必要に応じて壊れたメガネ ソリューション プロファイル

SELECT TOP (1) [t0].[name]
FROM [lntmuser].[attach] AS [t0]
WHERE [t0].[sysid] = @p0
4

1 に答える 1

31

を使用する前にnameプロパティに投影しFirst()ます。

var fp = lnq.attaches.Where(a => a.sysid == sysid)
                     .Select(a => a.name)
                     .First();

ただし、これはインデックスの使用を変更しません-そのため、Where句が責任を負います(最初のクエリで、に渡したラムダFirst())。どちらのクエリも、列のインデックスの恩恵を受けnameます。2 番目のクエリは、実体化する必要がある列の値が 1 つだけであるため、高速です。

于 2012-04-14T00:35:20.403 に答える