4

という非常に単純なテーブルがMemberあります。これは次のもので構成されています。

CREATE TABLE [dbo].[Member](
    [Member_MemberId] [int] IDENTITY(1000,1) NOT NULL,
    [Member_ExternalId] [varchar](32) NULL,
    [Member_ConsumerId] [varchar](32) NULL,
 CONSTRAINT [PK_Member] PRIMARY KEY NONCLUSTERED 
(
    [Member_MemberId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

次のように、データコンテキストから EF 4.0 を使用してクエリを実行しています。

return Members.SingleOrDefault(member => member.ExternalId == externalId);

生成された SQL は次のようになります。

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Member_MemberId] AS [Member_MemberId], 
[Extent1].[Member_ExternalId] AS [Member_ExternalId], 
[Extent1].[Member_ConsumerId] AS [Member_ConsumerId]
FROM [dbo].[Member] AS [Extent1]
WHERE [Extent1].[Member_ExternalId] = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0='Paul'

varchar(8000)列自体が に制限されている場合に、Member_ExternalId 列を として自動的にキャストすることを考えると、パフォーマンスの POV から、このクエリは最適ではありませんvarchar(32)。対応する行と同等のサイズのオンザフライ パラメーターを EF に強制的に生成させる方法はありますか?

4

2 に答える 2

1

これを直接実装する方法はないようです。実行計画間の一貫性を保証する組み込み機能だと思います。それまでの間、クエリをストアド プロシージャに置き換えました。

于 2012-07-02T16:22:43.843 に答える