2012-07-02 27 views
4

我有一個非常簡單的表叫Member,其中包括以下內容:如何強制實體框架4.0,產生大小相等的參數及其相應的數據庫列

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從一個DataContext如下:

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' 

從性能POV看,此查詢不是最理想的,因爲它自動將Member_ExternalId列轉換爲varchar(8000),而列本身僅限於varchar(32)。 有沒有辦法強制EF生成大小等於其相應行的動態參數?

+0

爲什麼將參數強制轉換爲varchar(8000)是不理想的? – codeulike

+0

我應該澄清;我們的駐地DBA堅持認爲它在內存分配方面並不理想。他沒有詳細說明。你怎麼看? –

+0

他在理論上可能是對的,但現在8k並沒有那麼多,並且可能很快就會重新分配。執行SQL語句的兩個變體的幾百次運行,一次使用varchar(8000),另一次使用varchar(32),查看是否有任何性能差異。 – codeulike

回答

1

似乎沒有直接實現這一點的方法。我認爲這是一個內置的功能來保證執行計劃的一致性。在此期間,我用存儲過程替換了查詢。

+0

我認爲EF團隊應該根據模型實現正確的參數大小和類型。難以實施嗎?是否應該將這樣的要求發送給EF團隊?你怎麼看? – Naomi

+0

我不確定拿俄米。在EF和直接SQL的使用方面,這並不是一個合理的解決方案,但是這是數據庫管理員通常需要考慮的一個問題,需要優化。 –

+1

我向EF團隊添加了一條建議。如果你喜歡它,請參閱https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/6286842-for-char-nchar-and-varchar-nvarchar-columns-use-th並投票。 – Naomi

相關問題